首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用fscanf()使用feof()

使用fscanf()使用feof()
EN

Stack Overflow用户
提问于 2013-03-30 22:02:21
回答 4查看 19.5K关注 0票数 3

这是我的代码。

代码语言:javascript
复制
#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是

代码语言:javascript
复制
1   2
3   4

我的输出是

代码语言:javascript
复制
1   2
3   4
4   4

为什么我的最后一行被打印了两次。fp还没有达到EOF吗?

此外,stackoverflow中的标记表示Usually, when it is used, the code using it is wrong.是什么意思?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-30 22:07:54

在不立即检查输入操作结果的情况下,绝不能执行输入操作!

下面的代码应该可以工作:

代码语言:javascript
复制
while (fscanf(fp,"%d %d",&a,&b) == 2)
{
    printf("%d %d\n",a,b);
}

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

票数 6
EN

Stack Overflow用户

发布于 2013-03-30 22:10:47

另外,stackoverflow中的标签表示Usually, when it is used, the code using it is wrong.是什么意思?

这意味着feof()函数(以及与EOF相关的其他功能)的使用方式经常被误解和错误。您的代码也是如此。

首先,fscanf()并不总是像您认为的那样工作,而且使用fgets()可以更好地从文件中获取行。然而,,如果你真的倾向于使用fscanf(),那么检查它是否能读取一些东西,否则,当它不能时,你会打印一次超过需要的变量。所以你应该做的是:

代码语言:javascript
复制
fp = fopen("hello.txt", "r");

while(fscanf(fp, "%d %d", &a, &b) == 2) {
    printf("%d %d\n", a, b);
}

fclose(fp);

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

票数 3
EN

Stack Overflow用户

发布于 2013-03-30 22:24:05

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

代码语言:javascript
复制
while(1){
  fscanf(fp,"%d %d",&a,&b);
  if (feof(fp))
     break;
  printf("%d %d\n",a,b);
}

(请注意,此示例不检查错误,仅检查EOF)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15719360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档