【问题标题】:Using fscanf() using feof()使用 fscanf() 使用 feof()
【发布时间】:2023-03-09 16:23:01
【问题描述】:

这是我的代码。

#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. 这是什么意思?

谢谢。

【问题讨论】:

  • main 应该在 C 和 C++ 中返回 int(您的编译器可能允许这样做,但不要这样做。)
  • 这是一个很棒的标签描述。 eof 确实几乎不是你想要的。

标签: c scanf feof


【解决方案1】:

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

以下应该有效:

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

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

【讨论】:

    【解决方案2】:

    另外,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);
    

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

    【讨论】:

      【解决方案3】:

      你得到一个额外的行的原因是EOF直到之后fscanf尝试第三次读取,所以它失败了,你打印了结果。这会做你想做的事情:

      while(1){
        fscanf(fp,"%d %d",&a,&b);
        if (feof(fp))
           break;
        printf("%d %d\n",a,b);
      }
      

      (注意这个例子不检查错误,只检查EOF)

      【讨论】:

      • 这将在格式错误的输入 such as this one 上中断。
      • @KerrekSB 这只是feof 工作原理的一个简单示例,使用原始代码 - 它回答了问题。
      【解决方案4】:

      您可以执行以下操作:

      #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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多