读取混合类型文件中的整数,“feof”不起作用

Reading ints in a file of mixed types, "feof" not working

提问人: 提问时间:5/21/2017 最后编辑:too honest for this site 更新时间:6/10/2018 访问量:159

问:

我的程序中出现了错误(应该找到字符和整数文件中的所有整数和整数),其中“feof”不起作用(而循环永无止境)或没有读取/找到整数,除非整个文件充满了整数。

我的代码...

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

  int main(void)
  {
   FILE *ptr;
   int val;
   int i = 0;
   char myChar;
   int chc;
   int result = 0;

     ptr = fopen("stuff.txt", "w");

     if(ptr == NULL)
       {
        printf("Could not open file \n");
       }

    for(; i < 5; ++i)
       {
        printf(" Char(0) or int(1)? ");
        scanf("%d", &chc);

       if(chc == 0)
         {
          printf(" Enter a char: ");
          scanf(" %c", &myChar);

          fprintf(ptr, " %c \n", myChar);
         }
       else
         {
          printf(" Enter an int: ");
          scanf("%d", &val);

          fprintf(ptr, " %d \n", val);
         }
      }

     fclose(ptr);

 FILE *rp;

 rp = fopen("stuff.txt", "r");

 if(ptr == NULL)
   {
    printf("Could not open file \n");
   }
 else
   {

    while(!feof(rp))
         {
           if(isdigit(fgetc(rp)))
             {
              ++result;
             }
          }
   }

  printf(" Total numbers in file: %d\n", result);


 return 0;
}

编辑:

我忘了重新添加“int result”,这是一个新错误。可能与有人提到的 fgetc 有关。我的总数中增加了一个额外的。

已解决:我将 34 读作“3”和“4”,所以它算作 2。不确定如何标记为已解决或是否将其删除。

 Char(0) or int(1)? 0

 Enter a char: e

 Char(0) or int(1)? 1

 Enter an int: 34

 Char(0) or int(1)? 0

 Enter a char: p

 Char(0) or int(1)? 0

 Enter a char: d

 Char(0) or int(1)? 0

 Enter a char: u

 Total numbers in file: 2
C file-IO feof

评论

0赞 ThingyWotsit 5/21/2017
stackoverflow.com/q/5431941/7761980
1赞 Jonathan Leffler 5/21/2017
See while (!feof(file)) 总是错的。这段代码是一个例外;当返回 EOF 时,后续将是准确的,并且您不会将 EOF 误视为数字。fgetc()feof(rp)
0赞 BLUEPIXY 5/21/2017
不要复制。循环结束。
0赞 5/21/2017
@JonathanLeffler fgetc 一定是为什么我在我的总数中多加一个?我确实看到了你提到的问题。我尝试了“if(fscanf(rp, ”%d“, &v) == 1)”,它要么挂起,要么不结束循环。
1赞 BLUEPIXY 5/21/2017
'3'所以.'4'2

答:

0赞 user3629249 5/22/2017 #1

关于代码块:

while(!feof(rp))
     {
       if(isdigit(fgetc(rp)))
         {
          ++result;
         }

此代码块包含几个问题,包括格式不容易阅读。对这个问题的评论中已经详细说明了一些问题。建议:

int ch;
while(EOF != (ch = fgetc(rp)) )
{
    if(isdigit(ch))
    {
        ++result;
    }
}

请注意,这计算每个数字,并且您说您只对整数感兴趣,整数可能是多个数字,因此您需要稍微修改建议的代码。我会让你做那个修改。