使用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); } }