我使用fscanf()函数来读取一个如下所示的文本文件:
d 5.234 f
a 4.234 b
d 53.5 c
...
等等。我想总结中间列中的值,但仅在第一个字母为d且第二个为f的行中。我的代码如下所示:
FILE *p;
char x[2], z[2];
float y, sum=0;
p=fopen("file.txt", "r");
if(p==NULL) return 1;
while(!feof(p))
{ fscanf(p, "%s %f %s", &x, &y, &z);
if (x[0]=='d' && z[0]=='f') sum+=y;
}
并且它工作正常 - 只要x和z是数组。如果我将它们声明为单个字符,那么告诉fscanf()扫描这样的(%c),由于某种原因它会在文件的最后一行中运行两次。因此,如果最后一行符合要求,则总和大于它应该是的。任何人都能说出它的区别吗?
答案 0 :(得分:0)
你的错误是feof()。
如果上次操作导致EOF,则触发。使用%s,匹配器将继续读取直到达到EOF。用%c它不会。然后对fscanf()的下一次调用失败,但是你没有检查它。
while(!feof(fp))
{
/* read from fp */
}
是常见的反模式或错误。