使用fscanf()使用feof()

时间:2013-03-30 14:02:21

标签: c scanf feof

这是我的代码。

#include<stdio.h>
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. 这是什么意思?

感谢。

4 个答案:

答案 0 :(得分:6)

如果不立即检查结果,就不得执行输入操作!

以下内容应该有效:

while (fscanf(fp,"%d %d",&a,&b) == 2)
{
    printf("%d %d\n",a,b);
}

这将在第一次转换失败或文件结束时停止。或者,您可以区分转换失败(跳过错误的行)和文件结束;请参阅fscanf的文档。

答案 1 :(得分:3)

  

此外,stackoverflow中的标记显示Usually, when it is used, the code using it is wrong.这是什么意思?

这意味着使用feof()函数(以及与EOF相关的其他功能)的方式经常被误解和错误。你的代码也是如此。

首先,fscanf()并不总是按照您的想法执行,并且使用fgets()可以更好地从文件中获取行。 但是,如果您真的倾向于使用fscanf(),那么检查它是否可以读取某些内容,否则当它不能时,您将打印变量一次超过需要。所以你应该做的是:

fp = fopen("hello.txt", "r");

while(fscanf(fp, "%d %d", &a, &b) == 2) {
    printf("%d %d\n", a, b);
}

fclose(fp);

另外,请使用空格,您的代码很难阅读。

答案 2 :(得分:2)

你获得额外一行的原因是在 fscanf尝试第三次读取之后才设置EOF,因此它失败了,无论如何你打印结果。这可以做你想要的那种事情:

while(1){
  fscanf(fp,"%d %d",&a,&b);
  if (feof(fp))
     break;
  printf("%d %d\n",a,b);
}

(请注意,此示例不会检查错误,仅针对EOF)

答案 3 :(得分:0)

您可以执行以下操作:

#include <stdio.h>

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