Posts Tagged ‘ feof

feof() не знает о конце файла

May 16, 08 by TracKer

Интересной и, кстати сказать, очень неожиданной новостью для меня стало то, что feof() на самом деле не знает о конце файла, прочитали ли мы последний символ/байт или все еще готовы читать дальше.

Собственно поподробнее.

Писал я маленький скрипт, ориентированный на использование бинарных файлов. В общем-то все было уже готово, однако в самый последний момент было обнаружено, что по непонятной причине в буфере к прочитанным данным почему-то приплюсовывается дополнительно 10 байт данных (забитых нулями). Я не мог понять почему fread() читает за пределами файла, а feof() не находит его конец, прочитывая последний байт. Провозился 4 часа, потом решил поискать… И нашел.

Принцип работы с функцией feof() следующий:  необходимо дочитать до конца файла, а потом прочитать еще один или более символов/байт за пределами файла, и только после этого feof() поймет что файл всетаки кончился.

Оказывается об этом люди знали еще в 2005 году, однако никакого намека в мануале PHP найти не удалось. Есть даже заявление на исправление ошибки в баг-трейсе, однако по комментарию одного из разработчиков становится понятно, что это скорее фича языка, чем баг.

Особенно эта фича рулит при работе с бинарными файлами, где каждый байт на счету. :)

Будте внимательны, фичи на каждом шагу! ;)