使用 fscanf() 使用 feof()

Using fscanf() using feof()

提问人:Kraken 提问时间:3/30/2013 更新时间:3/31/2013 访问量:20503

问:

这是我的代码。

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

我的你好.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.

谢谢。

c 扫描 feof

评论

0赞 Jacob Parker 3/30/2013
main应该在 C 和 C++ 中返回(您的编译器可能允许它,但不要这样做。int
2赞 Kerrek SB 3/30/2013
这是一个很棒的标签描述。 确实几乎从来都不是你想要的。eof
0赞 William Pursell 5/15/2013
你在滥用:stackoverflow.com/questions/5431941/......feof

答:

6赞 Kerrek SB 3/30/2013 #1

在未立即检查其结果的情况下,绝不能执行输入操作!

以下操作应有效:

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

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

0赞 Johnny Mnemonic 3/30/2013 #2

您可以执行以下操作:

#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);
    }
}
3赞 user529758 3/30/2013 #3

另外,stackoverflow 中的标签说这是什么意思?Usually, when it is used, the code using it is wrong.

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

首先,它并不总是像您认为的那样执行,并且使用 .但是,如果您真的倾向于使用 ,请检查它是否可以读取某些内容,否则当它不能时,您将打印变量的次数超过需要的次数。所以你应该做的是: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赞 teppic 3/30/2013 #4

您获得额外一行的原因是 EOF 直到第三次尝试读取才设置,因此它失败了,您仍然打印结果。这将做你想要的那种事情:fscanf

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

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

评论

0赞 Kerrek SB 3/31/2013
这将在格式错误的输入(例如此输入)上中断。
0赞 teppic 3/31/2013
@KerrekSB 这只是一个示例,使用原始代码来回答问题。feof