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

May 16, 08 by TracKer

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

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

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

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

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

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

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

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
Add your comment

One response for this post

  1. jeka911 Says:

    Такая фигня видимо не только в пхп. Я когда-то с си парился также, даже толком не вкурил баг то был или я гнал, но перешел на запись структур в файл, теперь знаю где конец до того как узнает feof. Конечно, ситуация меняется, когда большое и чужое что-то нужно читать.

Leave a Reply