fscanf读取最后一个整数两次

pdh*_*al1 8 c file-io

我有以下简单的程序从文本文件(num.txt)中读取.文本文件的每行数字为1 2 3 4 5.当我运行程序时,它会打印5次.任何人都能告诉我为什么会发生这种情况,以及如何解决这个问题?提前致谢

int main(void)
{
   int number;
   FILE *file;

   int i = 0;;

   file = fopen("num.txt", "r");

   while (!feof(file)){

      fscanf(file, "%d", &number);
      printf("%d\n", number);
      }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我的文本文件num.xtx

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

这是程序输出

1
2
3
4
5
5
Run Code Online (Sandbox Code Playgroud)

额外5

aja*_*jay 8

scanf函数族的手册页,

EOF如果在第一次成功转换或匹配失败发生之前达到输入结束,则返回该值. EOF如果发生读取错误,也会返回,在这种情况下,将设置流的错误指示符,并将errno其设置为指示错误.

这意味着最后一次成功fscanf调用从流中读取最后一行,file之后while循环条件!feof(file)为真,因为尚未满足文件结束条件.这意味着循环执行一次额外的时间,并number再次打印变量的先前值.

请读一下 - while(!feof(file))总是错的

您应该检查返回值,scanf而不是检查文件流上的文件结束指示符.

#include <stdio.h>   

int main(void) {
   int number;
   FILE *file = fopen("num.txt", "r");

   // check file for NULL in case there
   // is error in opening the file
   if(file == NULL) {
      printf("error in opening file\n");
      return 1;
   }      

   // check if fscanf call is successful 
   // by checking its return value for 1.
   // fscanf returns the number of input
   // items successfully matched and assigned
   while(fscanf(file, "%d", &number) == 1)
      printf("%d\n", number);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)


zne*_*eak 5

第二次fscanf失败,并没有写任何东西number,这就是为什么它仍然是最后一次5.要知道是否fscanf成功,您必须检查其返回值.

fscanf返回它写入的参数数量.在你的情况下,如果它返回1,它工作; 如果它返回0,则不会.这是你应该检查而不是feof.

while (fscanf(file, "%d", &number) == 1)
{
    printf("%d\n", number);
}
Run Code Online (Sandbox Code Playgroud)