C语言 使用fscanf()使用fof()



这是我的代码。

#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 %dn",a,b);
    }
}

我的hello.txt是

1   2
3   4

My Output is

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 %dn",a,b);
}

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

另外,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 %dn", a, b);
}
fclose(fp);

另外,请使用空白,你的代码很难阅读。

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

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

(注意这个例子不检查错误,只检查EOF)

您可以这样做:

#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 %dn",a,b);
    }
}

相关内容

  • 没有找到相关文章

最新更新