一个结构的getdata函数没有读取所有数据
问题描述:
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
#define MAX_BASE 8
#define ROW 9
#define COLUMN_SCORE 12
#define MAX_SKATER 4
typedef struct{
char name[MAX];
int elements;
float baseval[MAX_BASE];
int score[12][MAX_BASE];
double total_score;
}SKATER;
int getData(SKATER skater[MAX]);
//void calcData(SKATER skater[MAX]);
int main (void)
{
// Global Declarations
SKATER skater[MAX_SKATER];
int num;
// Function calls
num = getData(skater);
//calcData(skater);
return 0;
}
/********************************* getData ************************************
Pre:
Post:
*/
int getData(SKATER skater[MAX_SKATER])
{
// LOcal Declarations
FILE* fpIn;
int i = 0;
int k;
int j;
char buffer[100];
// Statements
if((fpIn = fopen("lab6data.txt","r"))==NULL)
{
printf("File opening error");
system("PAUSE");
exit(100);
}
while(i < MAX_SKATER && fgets(buffer, 100, fpIn))
{
sscanf(buffer,"%*c%19[^]", skater[i].name);
puts(buffer);
for(k = 0; k < MAX_BASE; k++)
{
sscanf(buffer,"%d %f", &skater[i].elements, skater[i].baseval);
for(j = 0; j < COLUMN_SCORE; j++)
{
sscanf(buffer,"%d", &skater[i].score[k][j]);
}
}
i++;
}
system("PAUSE");
fclose(fpIn);
return i;
}
这个getdata函数是从一个文件读取数据到结构数组。第一行包含名字,下一行包含元素数字的基数值剩下的数字就是分数,这会重复8次。 getdata函数只读取前3行数据,包括名字2其他行当我尝试放(缓冲区)为什么我得到这个问题任何人都可以告诉我如何解决它?我有任何逻辑错误?一个结构的getdata函数没有读取所有数据
这是数据:
MENS SHORT PROGRAM//http://www.isufs.org/results/owg2006/OWG06_Men_SP_Scores.pdf
LYSACEK Evan
1 7.5 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
2 10.0 1 2 2 1 1 1 1 2 0 1 1 1
3 3.0 1 2 2 2 1 0 1 2 1 1 1 2
4 3.1 1 1 1 1 1 0 0 0 1 0 1 0
5 1.7-3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
6 2.1 0 0 1 1 1 1 1 1 1 1 1 1
7 3.1 0 0 1 1 0 0 1 1 1 1 1 1
8 3.5 0 1 1 2 1 1 1 1 1 1 0 1
WEIR Johnny
1 7.5 2 2 2 2 1 1 1 1 1 2 1 1
2 10.0 1 1 1 1 2 0 1 1 1 1 2 1
3 3.0 1 1 1 2 1 0 1 1 2 2 2 2
4 3.1 1 2 1 2 1 1 0 0 2 1 1 0
5 5.5 0 -1 0 -1 -1 0 -1 -1 1 -2 -2 -2
6 1.3 1 1 1 2 1 1 1 0 1 1 1 2
7 3.1 0 1 1 1 1 0 0 1 2 1 1 1
8 3.0 -1 1 1 2 1 0 1 0 2 1 -1 1
PLUSHENKO Evgeni
1 13.0 0 2 1 1 1 0 1 0 1 1 1 1
2 7.5 1 2 2 2 2 1 2 1 2 2 2 2
3 6.0 2 1 1 1 1 0 0 2 1 2 1 2
4 2.3 2 1 1 1 1 1 2 1 1 1 1 1
5 3.4 2 2 2 2 1 2 3 3 2 3 2 1
6 2.1 1 1 1 2 2 0 0 0 1 2 1 1
7 3.1 1 0 2 2 1 1 1 2 2 2 2 1
8 3.5 1 1 2 2 1 1 1 1 2 2 1 1
SAVOIE Matthew
1 3.0 0 0 0 1 0 0 0 0 0 0 0 -1
2 7.5 1 2 2 1 1 1 1 1 1 1 2 2
3 9.5 0 1 1 0 0 0 0 0 0 0 1 1
4 3.1 1 1 1 1 1 1 0 0 1 1 0 0
5 1.9 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
6 2.1 0 0 1 0 1 0 0 1 1 1 1 1
7 3.1 0 0 1 0 0 0 1 1 2 0 2 1
8 3.0 0 0 1 1 1 0 1 1 1 1 1 1
答
既然是家庭作业我只会给你什么你已经走错了一些提示。我希望这能让你回到正确的轨道上! :)
你提到,你只在线路数量有限阅读。你应该看看你的循环条件,“而(我< MAX_SKATER & &与fgets(”,看看它为什么只打印您的一些线路。
我给你这一个,因为你是刚刚开始。在您的sscanf调用中要读取分数线,每个参数都必须作为指针传递,您传入的用于接收数据的第二个变量没有正确传递,而是使用“& skater [i] .baseval”。去你的玩家的名字sscanf
你需要再次调用fgets,可能在你的“for(k”循环中,因为你只是试图读你的标题行。 - 使用相同的缓冲区r数据(标题行)在尝试解析分数线时。
你需要在你的“for(j”循环中分开你的sscanf,在你的“(k”循环中产生一个新的sscanf,你将不得不阅读与分数分开的玩家数和baseval因为你有一个可读数的分数(COLUMN_SCORE)。
谢谢,我现在正在工作 – KhoaVo 2012-03-21 07:23:52