这是我的代码。
#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);
}
}