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);
}