Страницы

Поиск по вопросам

пятница, 5 октября 2018 г.

Правильное использование проверки конца файла

При использовании кода
while(!feof(file)) { // Чтение из файла }
в C или
while(!file.feof()) { // Чтение из файла }
в C++ получаются неприятности - лишняя считанная строка, например. Почему? Как правильно проверить, что достигнут конец файла?


Ответ

Признак достижения конца файла выставляется только после неудачной попытки чтения за его концом. Поэтому, если в теле цикла нет проверки, успешно ли выполнено чтение из файла - последнее чтение окажется именно тем неудачным чтением, которое выставит признак достигнутого конца файла (а для вас это будет выглядеть как, например, еще раз считанная последняя строка, если она находилась в буфере для чтения).
Лучше в заголовке цикла while выполнять само чтение с проверкой - например, в программе на C это могло бы выглядеть как
while(fread(&data,sizeof(data),1,file)==1) { // Обработка считанных данных }
if (feof(file)) // Достигнут конец файла puts("Ошибка чтения: достигнут конец файла"); else if (ferror(file)) { puts("Ошибка чтения файла");
или на C++ - наподобие
for(int n; file >> n; ) { // Обработка считанного значения n }
if (file.bad()) std::cout << "Ошибка ввода-вывода при чтении
"; else if (file.eof()) std::cout << "Достигнут конец файла
"; else if (file.fail()) std::cout << "Неверный формат данных
";

Комментариев нет:

Отправить комментарий