Проблема с EOF при определении конца потока - PullRequest
1 голос
/ 17 мая 2011

Когда я пытаюсь определить конец файла с помощью функции feof(FILE *), я обнаруживаю, что он не работает так, как я ожидал: требуется дополнительное чтение, даже если поток заканчивается.Например, feof(FILE*) не скажет true, если вызывается для файла с 10-байтовыми данными сразу после считывания 10 байт.Мне нужна дополнительная операция чтения, которая, конечно, возвращает 0, тогда feof(FILE *) скажет: «Хорошо, теперь вы достигли конца».

Мой вопрос: почему требуется еще одна read и как определить конецфайла или как узнать, сколько байтов осталось в файловом потоке, если я не хочу стиль feof?

Спасибо и наилучшими пожеланиями.

1 Ответ

11 голосов
/ 17 мая 2011

Не используйте feof () или любые другие варианты - это так просто. Вы хотите, чтобы он каким-то образом предсказал, что следующее чтение не удастся, но это не то, что он делает - он говорит вам, каким был результат ПРЕДЫДУЩЕГО чтения. Правильный способ чтения файла (в псевдокоде):

while( read( file, buffer ) ) {
   do something with buffer
}

Другими словами, вам нужно проверить результат операции чтения. Это верно как для потоков C, так и для iostreams C ++.

...