3

这是我的代码。

#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

4 回答 4

6

切勿在未立即检查结果的情况下执行输入操作!

以下应该有效:

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

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

于 2013-03-30T14:07:54.017 回答
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);

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

于 2013-03-30T14:10:46.707 回答
2

The reason you're getting an extra line is that EOF isn't set until after fscanf tries to read a third time, so it fails, and you print the results anyway. This would do the sort of thing you've intended:

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

(Note that this example does not check for errors, only for EOF)

于 2013-03-30T14:24:05.253 回答
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);
    }
}
于 2013-03-30T14:09:22.017 回答