【问题标题】:How to use EOF to read all data from file如何使用EOF从文件中读取所有数据
【发布时间】:2020-06-05 06:00:16
【问题描述】:

我正在学习 C 语言中的文件 i/o,我编写了这个读取文件的程序,然后对于找到的每个偶数,它必须将 * 打印到屏幕上。

我的问题是我的程序一直在打印*

我尝试了不同的方法,其中一些来自这个网站,但我似乎无法理解如何使用 EOF 读取文本文件的结尾。

我想学习如何阅读文本文件直到文件结束。 如何阅读直到文本文件的结尾? C 中的 EOF。


int main(void)
 {

     int num;
     FILE *ifp;

     ifp = fopen("numbers.txt", "r" );

     if(ifp == NULL)
     {
         exit(1);
     }

     do
     {
         fscanf(ifp, "%d", &num);       

            if(num%2 == 0)

                {
                printf("*\n");
                }
        } while(num != EOF);


    fclose(ifp);

    return 0;
}

【问题讨论】:

  • 您正在打印* 的偶数。
  • @Lucas 对此感到抱歉!我已经修正了错字

标签: c file-io eof


【解决方案1】:

你需要检查scanf的结果

     do
     {
         int result;
         result = fscanf(ifp, "%d", &num);       
         if(result == EOF) break;

         if(result != 1) 
         {
             printf("scanf error\n");
             break;
         }
         if(num%2 == 0)
         {
              printf("*\n");
         }
      } while(1);

【讨论】:

  • 嘿! thx,我做了这些更改,现在不打印*。我检查了他的调试器,发现它进入了第 25 行的scanf error
  • 所以你的文件有问题。它无法扫描。 总是检查任何 I/O 操作的结果
【解决方案2】:

相反,您应该尝试while 循环。

#include <stdio.h>
#include <stdlib.h>

int main(void)
 {

     int num;
     FILE *ifp;

     ifp = fopen("numbers.txt", "r" );

     if(ifp == NULL)
     {
         perror("Read");
         exit(1);
     }

     while(fscanf(ifp, "%d ", &num) != EOF)
     {

         if(num % 2 != 0) // For every odd number.

                {
                printf("*\n");
                }
     }
    fclose(ifp);

    return 0;
}

【讨论】:

    【解决方案3】:

    你试过这个吗:

    while (!feof(ifp)) {
       if (fscanf(ifp, "%d ", &num) > 0) {
          if(num % 2 != 0) // For every odd number.
                    {
                    printf("*\n");
                    }
       }
    }
    

    【讨论】:

      【解决方案4】:

      这样做是因为while(num != EOF) 正在测试从文件中读取的数字int num 是否为EOF,而不是是否已到达文件末尾。

      要测试是否在 FILE *ifp 上设置了 EOF 标志,请改用 while(!feof(ifp))

      【讨论】:

      • 嘿!感谢您的帮助。我应该做while循环还是将它添加到do-while循环的末尾?谢谢
      • 是的,我强烈建议您阅读该帖子,该帖子由 P_J_ 链接
      • @P__J__ 我没有考虑并发,我将编辑我的帖子以反映我的建议不是最佳实践。但是,我说的第一部分仍然是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2020-07-19
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多