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