这是我的代码。
#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.是什么意思?
谢谢。
发布于 2013-03-30 22:07:54
在不立即检查输入操作结果的情况下,绝不能执行输入操作!
下面的代码应该可以工作:
while (fscanf(fp,"%d %d",&a,&b) == 2)
{
printf("%d %d\n",a,b);
}这将在第一次转换失败或文件结束时停止。或者,您可以区分转换失败(跳过错误的行)和文件结束;请参阅fscanf的文档。
发布于 2013-03-30 22:10:47
另外,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-30 22:24:05
得到额外一行的原因是直到fscanf第三次尝试读取之后才设置EOF,所以它失败了,并且您无论如何都会打印结果。这将会做你想做的事情:
while(1){
fscanf(fp,"%d %d",&a,&b);
if (feof(fp))
break;
printf("%d %d\n",a,b);
}(请注意,此示例不检查错误,仅检查EOF)
https://stackoverflow.com/questions/15719360
复制相似问题