ProfiPHPProfiPHP
Категория: Функции для работы с файловой системой

Функция Fgets

Функция Fgets читает строку из файла.
string fgets( resource $handle [, int $length ] )
Параметр Handle являет собой корректный указатель на файл, успешно открытый функциями Fopen или Fsockopen. Функция должна обязательно вызываться до закрытия функцией Fclose.

Функция Fgets составляется из следующих аббревиатур: F - File (файл), Get (взять), S - String (строка).

Чтение заканчивается по достижении Length - 1 байт или при достижении окончания строки (символы переноса строки "\n" или "\r\n") или конца файла. Если длина не указана, чтение из потока будет продолжаться до тех пор, пока не достигнет конца строки.

Единица в выражении Length - 1 отнимается потому, что символ окончания строки также занимает 1 байт, и его необходимо исключить в результирующей строке.

Функция Fgets возвращает строку размером в Length - 1 байт, прочитанную из дескриптора файла, на который указывает параметр Handle. Если данных для чтения больше нет, то возвращает FALSE.

Также необходимо учитывать кодировку строки. Длина строки не обязательно будет соответствовать количеству байт в ней, так как в различных кодировках различные символы кодируются различным количеством байт, например, юникод может быть и двух-, и четырёхбайтным. Поэтому, если в строке существуют русские буквы, указание параметра Length может вывести испорченное последнее значение, если вы не угадаете правильное количество байт последнего символа.

Также необходимо заметить, что если указан необязательный атрибут Length и он занимает меньше байт чем исходная строка, функция Fgets не будет осуществлять самостоятельный переход на новую строку. Поэтому у большинства начинающих программистов возникает вопрос, почему Fgets с параметром Lenght не правильно работает в цикле While, а именно не переводит на новую строку. Из этого можно сделать вывод, что для циклов лучше не использовать данную функцию с указанием длины строки или же использовать самостоятельный переход на новую строку.

Пример работы:
$handle = fopen( $_SERVER['DOCUMENT_ROOT'].'/file.txt', 'r' );
echo fgets( $handle, 3 );
echo fgets( $handle, 4 );
echo fgets( $handle, 5 );
На первый взгляд можно предположить, что будет выведены 3 байта первой строки, 4 байта второй строки и 5 байтов третьей строки. Но на самом деле, если длина строки превышает указанное в функции количество байтов, переход на новую строку не будет осуществлен, в результате чего данный пример выведет 3+4+5=12 байт первой строки.

Пример использования:
$handle = fopen( $_SERVER['DOCUMENT_ROOT'].'/file.txt', 'r' );
while ( ! feof( $handle ) ) {
echo fgets( $handle );
}
fclose( $handle );
В результате примера будет выведена вся информация, которая содержится в файле File.txt.

Добавить комментарий

Имя:
Текст комментария: