Недавно я столкнулся с проблемой, вызванной использованием fstream :: eof(). Я прочитал следующую строку из here:Почему std :: fstream устанавливает бит EOF так, как он делает?
Функция EOF() возвращает истину, если конец связанного входного файла был достигнут, ложь в противном случае.
и (ошибочно) предположил, что это означает, что если бы я использовал 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.
ОБНОВЛЕНИЕ Спасибо за ответы, я думаю, у меня это есть. Единственная операция, которую я выполняю, - read(), и я сразу же проверяю fail(), поэтому я думаю, что я в порядке. Теперь, мой вопрос, что будет Я использую eof() для?
для (int i = 0; i