C中的fscanf() - %s和%c

时间:2017-02-20 23:33:44

标签: c

我使用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),由于某种原因它会在文件的最后一行中运行两次。因此,如果最后一行符合要求,则总和大于它应该是的。任何人都能说出它的区别吗?

1 个答案:

答案 0 :(得分:0)

你的错误是feof()。

如果上次操作导致EOF,则触发。使用%s,匹配器将继续读取直到达到EOF。用%c它不会。然后对fscanf()的下一次调用失败,但是你没有检查它。

  while(!feof(fp))
  {
      /* read from fp */
  }

是常见的反模式或错误。