如何使用EOF从文件中读取所有数据

How to use EOF to read all data from file

提问人:Kakarotto 提问时间:6/5/2020 最后编辑:Kakarotto 更新时间:6/5/2020 访问量:313

问:

我正在学习 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;
}

C 文件-IO EOF

评论

0赞 Shubham 6/5/2020
不过,您正在为偶数打印。*
0赞 Kakarotto 6/5/2020
@Lucas很抱歉!我已经修复了错别字

答:

0赞 Joseph Pilliner 6/5/2020 #1

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

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

评论

0赞 Kakarotto 6/5/2020
嘿!谢谢你的帮助。我应该做while循环还是在do-while循环的末尾添加它?感谢
3赞 0___________ 6/5/2020
不不不 stackoverflow.com/questions/5431941/......
1赞 Shubham 6/5/2020
是的,我强烈建议您阅读该帖子,该帖子由P_J_链接
0赞 Joseph Pilliner 6/5/2020
@P__J__我没有考虑并发,我将编辑我的帖子以反映我建议的不是最佳实践。但是,我所说的第一部分仍然是正确的。
2赞 0___________ 6/5/2020 #2

您需要检查结果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);

评论

0赞 Kakarotto 6/5/2020
嘿!谢谢,我做了这些更改,现在不打印.我检查了他的调试器,并注意到它进入了第 25 行*scanf error
2赞 0___________ 6/5/2020
所以你的文件有问题。扫描失败。始终检查任何 I/O 操作的结果
0赞 Shubham 6/5/2020 #3

相反,您应该尝试循环。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;
}
0赞 Catch22 6/5/2020 #4

你试过这个吗:

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