我正在学习C语言,我遇到了实施程序的问题 使用test.txt文件作为程序的输入。
test.txt
文件的内容是:
1 30 30 40 50 60
2 40 30 50 60 60
3 30 20 10 20 30
4 40 20 10 10 30
5 20 10 10 10 30
我试图让每个学生的平均分数为1~5。
所以我实现如下:
while(cnt) //I set cnt 5 to repeat it for 5 times
{
fseek(fp, 2, SEEK_CUR); //to ignore index number in first + blank
acc=0; //clear data in acc
while(1)
{
score=fgetc(fp);
if(score==' ')
fseek(fp, 1, SEEK_CUR); // if it is black then ignore and move
else if(score=='\n') // if I meet enter then break
break;
else
{
acc+=score; //get total score of a student
}
}
cnt--;
printf("%d ", acc/5); //get average score and print
}
但是程序的结果是
58
58
58
58
我无法弄清楚出了什么问题......
他们必须是5个节目输出,因为那里有5个学生
但它只给出了4个学生的平均分数,所有输出都相同..
答案 0 :(得分:4)
您的代码存在一些问题。其中:
fgetc
来读取字符,一个字符在a处
时间。如果您想阅读一个,这对于“50”的分数不起作用
一次得分。fgetc
将返回字符代码,而不是数字。所以,如果你
有{ASCII},当fgetc
读取1时,它将返回49。我建议你尝试使用fscanf("%d", ..)
。
答案 1 :(得分:1)
fgetc
你逐个字符地获取ascii值,这是行不通的。
您可以参考以下代码。
int arr[6];
while(cnt--) {
for(acc = 0, i = 0; i < 6; i++) {
fscanf(fp, "%d", &arr[i]);
if (i > 0)
acc += arr[i]; //get total score of a student
}
printf("%d %d\n", arr[0], acc/5); //get average score and print
}
答案 2 :(得分:0)
很高兴看到有人真正从错误中吸取教训(上一个问题)
首先,如果您事先了解学生人数,则可能应使用for
循环代替while
。
其次,你是以非常复杂的方式做到这一点 - 在循环中读取整行然后使用字符串来解析它可能更简单。
此外,您似乎将数字添加为字符,因此您得到的结果可能是其ASCII码的平均值
答案 3 :(得分:0)
你正在获得单个角色,所以使用这个角色你无法得到真正的答案。
要从文件中获取总输入,您可以使用
char *fgets(char *s, int size, FILE *stream);
然后从字符串中获取输入,您可以使用sscanf。
int sscanf(const char *str, const char *format, ...);
然后使用六个变量来获取输入,包括id no。然后添加五个变量并完成平均值。
sscanf(s,"%d %d %d %d %d %d",&id,&m1,&m2,&m3,&m4,&m5);
然后avg=(m1+m2+m3+m4+m5)/5".
答案 4 :(得分:0)
这样的东西?
#define MAXSCCORES 5
FILE *fp = NULL;
fopen_s (&fp, "data.txt","r");
int student = 0;
int score[MAXSCORES];
while (!feof(fp))
{
int count = fscanf_s(fp,"%d %d %d %d %d %d", &student, &score[0], &score[1], &score[2], &score[3], &score[4] );
if ( count == MAXSCORES+1 )
{
for (int i=1; i<MAXSCORES; i++)
score[0] += score[i];
score[0] = score[0] / MAXSCORES;
printf ("student %d Average Score = %d\n", student, score[0] );
}
}
fclose(fp);