feof() не знает о конце файла
May 16, 08 by TracKerИнтересной и, кстати сказать, очень неожиданной новостью для меня стало то, что feof() на самом деле не знает о конце файла, прочитали ли мы последний символ/байт или все еще готовы читать дальше.
Собственно поподробнее.
Писал я маленький скрипт, ориентированный на использование бинарных файлов. В общем-то все было уже готово, однако в самый последний момент было обнаружено, что по непонятной причине в буфере к прочитанным данным почему-то приплюсовывается дополнительно 10 байт данных (забитых нулями). Я не мог понять почему fread() читает за пределами файла, а feof() не находит его конец, прочитывая последний байт. Провозился 4 часа, потом решил поискать… И нашел.
Принцип работы с функцией feof() следующий: необходимо дочитать до конца файла, а потом прочитать еще один или более символов/байт за пределами файла, и только после этого feof() поймет что файл всетаки кончился.
Оказывается об этом люди знали еще в 2005 году, однако никакого намека в мануале PHP найти не удалось. Есть даже заявление на исправление ошибки в баг-трейсе, однако по комментарию одного из разработчиков становится понятно, что это скорее фича языка, чем баг.
Особенно эта фича рулит при работе с бинарными файлами, где каждый байт на счету.
Будте внимательны, фичи на каждом шагу!