Что такое возвращаемое значение feof () для закрытого файла? - PullRequest
3 голосов
/ 07 октября 2008

для потока FILE *, если я читаю как можно больше данных, feof (stream) возвращает меня не ноль. Тогда, если я fclose stream, то feof (stream) будет продолжать возвращать мне ненулевое значение? ГАРАНТИРУЕТСЯ?

Ответы [ 4 ]

12 голосов
/ 07 октября 2008

Вызов функции feof () для закрытого файла не имеет смысла (на самом деле хуже, чем бессмысленный - он не определен, поэтому все может произойти).

Из стандарта C:

Значение указателя на ФАЙЛ объект является неопределенным после связанный файл закрыт (в том числе стандартные текстовые потоки).

и

Успешный звонок в fclose Функция вызывает поток, указанный на потоком, который будет смыт и связанный файл должен быть закрыт. любой незаписанные буферизованные данные для потока доставляются в хост-среду быть записанным в файл; любой непрочитанный буферизованные данные отбрасываются. Будь то или не вызов успешен, поток отсоединяется от файла и любой буфер, установленный setbuf или setvbuf функция отделена от поток (и освобожден, если это было автоматически распределяется).

3 голосов
/ 07 октября 2008

В зависимости от реализации библиотеки, вызов fclose () приведет к освобождению ресурсов в структуре FILE, а последующие попытки могут привести к сбою. Я считаю, что стандартным термином для этого является «неопределенное поведение».

2 голосов
/ 08 октября 2008

Не делай этого. Не пытайтесь запустить feof() на закрытом файле. Результат не определен. Следите за тем, какие файловые дескрипторы закрыты каким-либо другим способом, вместо того, чтобы предполагать, что EOF будет сигнализироваться о них.

В общем, НЕОБХОДИМО, чтобы при написании переносимого кода НЕОБХОДИМО неопределенного поведения в С ... оно может сделать что-то разумное на вашей платформе, но может сделать что-то совершенно нелепое или неожиданное для другой.

Люди из группы Usenet comp.lang.c несколько лет назад придумали гипотетический компьютер DeathStation 9000 , который демонстрирует наиболее пугающее поведение в случае неопределенных конструкций. Это своего рода обучающий инструмент, который отпугивает вас от необходимости полагаться на неопределенное поведение в C: -)

1 голос
/ 07 октября 2008

Не для каждой реализации feof ().

На самом деле, вы даже не можете гарантировать, что любой f * вызов будет работать после того, как вы позвоните fclose.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...