提问人:Kraken 提问时间:3/30/2013 更新时间:3/31/2013 访问量:20503
使用 fscanf() 使用 feof()
Using fscanf() using feof()
问:
这是我的代码。
#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);
}
}
我的你好.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.
谢谢。
答:
6赞
Kerrek SB
3/30/2013
#1
在未立即检查其结果的情况下,绝不能执行输入操作!
以下操作应有效:
while (fscanf(fp,"%d %d",&a,&b) == 2)
{
printf("%d %d\n",a,b);
}
这将在第一次转换失败或文件末尾停止。或者,您可以区分转换失败(跳过错误的行)和文件结束;请参见 的文档。fscanf
0赞
Johnny Mnemonic
3/30/2013
#2
您可以执行以下操作:
#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);
}
}
3赞
user529758
3/30/2013
#3
另外,stackoverflow 中的标签说这是什么意思?
Usually, when it is used, the code using it is wrong.
这意味着该函数(以及与EOF相关的其他功能)的使用方式经常被误解和错误。你的代码也是如此。feof()
首先,它并不总是像您认为的那样执行,并且使用 .但是,如果您真的倾向于使用 ,请检查它是否可以读取某些内容,否则当它不能时,您将打印变量的次数超过需要的次数。所以你应该做的是: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赞
teppic
3/30/2013
#4
您获得额外一行的原因是 EOF 直到第三次尝试读取后才设置,因此它失败了,您仍然打印结果。这将做你想要的那种事情:fscanf
while(1){
fscanf(fp,"%d %d",&a,&b);
if (feof(fp))
break;
printf("%d %d\n",a,b);
}
(请注意,此示例不检查错误,仅检查 EOF)
评论
0赞
Kerrek SB
3/31/2013
这将在格式错误的输入(例如此输入)上中断。
0赞
teppic
3/31/2013
@KerrekSB 这只是一个示例,使用原始代码来回答问题。feof
评论
main
应该在 C 和 C++ 中返回(您的编译器可能允许它,但不要这样做。int
eof
feof