这是我的代码。
#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.
这是什么意思?
感谢。
答案 0 :(得分:6)
如果不立即检查结果,就不得执行输入操作!
以下内容应该有效:
while (fscanf(fp,"%d %d",&a,&b) == 2)
{
printf("%d %d\n",a,b);
}
这将在第一次转换失败或文件结束时停止。或者,您可以区分转换失败(跳过错误的行)和文件结束;请参阅fscanf
的文档。
答案 1 :(得分: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);
另外,请使用空格,您的代码很难阅读。
答案 2 :(得分:2)
你获得额外一行的原因是在 fscanf
尝试第三次读取之后才设置EOF,因此它失败了,无论如何你打印结果。这可以做你想要的那种事情:
while(1){
fscanf(fp,"%d %d",&a,&b);
if (feof(fp))
break;
printf("%d %d\n",a,b);
}
(请注意,此示例不会检查错误,仅针对EOF)
答案 3 :(得分: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);
}
}