Недавно я столкнулся с проблемой, вызванной использованием fstream:: eof(). Я прочитал следующую строку из здесь:
Функция eof() возвращает true, если конец связанного входного файла был достигнут, в противном случае - false.
и (ошибочно) предположил, что это означает, что если я использовал fstream:: read() и прочитал бы конец файла, функция eof() скажет мне. Поэтому я сделал что-то вроде этого (очень обобщенное):
for(int i = 0; i < max && !file.eof(); i++)
{
file.read(mything, sizeof(mything));
}
Проблема возникла из-за того, что объясняется позже на странице, связанной выше (которую я не смог прочитать изначально, из-за вводящего в заблуждение первого абзаца):
И наоборот, поток не переходит в состояние EOF, если после последнего токена происходит пробел, но попытка прочитать другой токен все равно будет терпеть неудачу. Поэтому флаг EOF нельзя использовать в качестве теста в цикле, предназначенном для чтения всего содержимого потока до EOF. Вместо этого следует проверить состояние отказа после попытки прочитать.
Итак, я изменился, и теперь мой цикл проверяет файл file.fail(), а не файл .eof(), и я понимаю, что работает HOW(). Мой вопрос: почему он работает именно так? Существуют ли ситуации, когда это желательно? Мне кажется, что как только вы передали EOF, вы передали EOF, а eof() должен вернуть true.
UPDATE Спасибо за ответы, я думаю, что у меня это получилось. Единственная операция, которую я выполняю, - read(), и я сразу же проверяю fail(), поэтому я думаю, что я в порядке. Теперь, мой вопрос: что бы я использовал eof() для?