使用feof()使用fscanf()
这是我的代码。
#include void main(){ FILE *fp; int a,b; fp=fopen("hello.txt","r"); while(!feof(fp)){ fscanf(fp,"%d %d",&a,&b); printf("%d %d\n",a,b); } }
我的hello.txt是
1 2 3 4
我的输出是
1 2 3 4 4 4
为什么我的最后一行被打印两次。 还没有fp达到EOF?
此外,stackoverflow中的标记说Usually, when it is used, the code using it is wrong.
这是什么意思?
谢谢。
如果不立即检查结果,就不能执行输入操作!
以下应该有效:
while (fscanf(fp,"%d %d",&a,&b) == 2) { printf("%d %d\n",a,b); }
这将在第一次转换失败或文件结束时停止。 或者,您可以区分转换失败(跳过错误的行)和文件结束; 请参阅fscanf
的文档。
此外,stackoverflow中的标记说
Usually, when it is used, the code using it is wrong.
这是什么意思?
这意味着使用feof()
函数(以及与EOF相关的其他function)的方式经常被误解和错误。 你的代码也是如此。
首先, fscanf()
并不总是按照你的想法做到,并且使用fgets()
可以更好地从文件中获取行。 但是,如果您真的倾向于使用fscanf()
,那么检查它是否可以读取某些内容,否则当它不能时,您将打印变量一次超过需要。 所以你应该做的是:
fp = fopen("hello.txt", "r"); while(fscanf(fp, "%d %d", &a, &b) == 2) { printf("%d %d\n", a, b); } fclose(fp);
另外,请使用空格,您的代码很难阅读。
你得到额外一行的原因是在 fscanf
第三次尝试读取之后才设置EOF,因此失败,无论如何都打印结果。 这会做你想要的事情:
while(1){ fscanf(fp,"%d %d",&a,&b); if (feof(fp)) break; printf("%d %d\n",a,b); }
(注意,此示例不检查错误,仅针对EOF)
您可以执行以下操作:
#include void main(){ FILE *fp; int a,b; fp=fopen("file.txt","r"); while(fscanf(fp,"%d %d",&a,&b)==2) { printf("%d %d\n",a,b); } }