fscanf дважды считывает последнее целое число

у меня есть следующая простая программа для чтения из текстового файла (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("%dn", number);
      }

   return 0;
}

вот мой текстовый файл num.xtx

1
2
3
4
5

и вот вывод программы

1
2
3
4
5
5

есть дополнительные 5

2 ответов


С главной страницы 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;
}

второй раз fscanf не удалось и ничего не написал number, вот почему это все еще 5 с последнего раза. Узнать, если fscanf успешно, вы должны проверить его возвращаемое значение.

fscanf возвращает количество аргументов, которые он писал. В вашем случае, если он возвращает 1, он работал; если он возвращает 0, это не так. Это то, что вы должны проверить вместо feof.

while (fscanf(file, "%d", &number) == 1)
{
    printf("%d\n", number);
}