Файловые указатели в PHP. Как осуществить выборочное извлечение информации?

файловые указатели в php. как осуществить выборочное извлечение информации?

Роль файловых указателей

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

Указатель - это целочисленное значение, соответствующее порядковому номеру байта, от которого будет произведена следующая операция. Например, если вы создали файл и записали в него некоторое количество данных, то следующее добавление информации произойдет с места остановки предыдущей операции.

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

Важно
Функции изменения положения курсора, рассматриваемые ниже, не будут иметь никакого эффекта, если файл был открыт в режиме доступа «a» или «a+». Операции записи в таком случае будут вестись только в конец файла.

Текущее местоположение указателя

Если вы хотите получить порядковый номер байта, на котором сейчас установлен файловый указатель, используйте функцию ftell(). Её единственный параметр принимает дескриптор файла. Функция вернет целочисленное значение в случае успеха и false, если что-то пошло не так.

//создадим временный файл для примера
$descriptor = tmpfile();

//Покажем позицию указателя до и после записи
echo 'До записи: '. ftell($descriptor) .'<br>';
fwrite($descriptor, 'тестовая строка');
echo 'После записи: '. ftell($descriptor);

Заметка
При проверке возвращаемого значения нужно осуществлять строгое сравнение. В PHP число «0», что соответствует началу файла, при использовании оператора «==», может быть преобразовано к false.

Сброс файлового указателя в начало

Для перевода указателя в начало файла нужно использовать функцию rewind(). Она принимает всего один параметр — дескриптор файла. Функция возвращает логическое значение true в случае успеха, а false при ошибке.

//запишем в файл текст, а затем сбросим указатель в начало
$descriptor = tmpfile();
fwrite($descriptor, 'временные файлы бывают очень удобны');
echo 'Конец строки в позиции: '. ftell($descriptor) .'<br>';

if (rewind($descriptor)) {
    echo 'Указатель сброшен на: '. ftell($descriptor);

} else {
    echo 'Невозможно перевести указатель в начало файла';
}

Указание нового местоположения

PHP позволяет задать местоположение файлового указателя явным образом с помощью функции fseek(). Её первый параметр ожидает получить дескриптор, а второй должен быть задан положительным или отрицательным целым числом.

Третий параметр является не обязательным. Он также принимает целочисленное значение и предназначен для указания места, от которого будет вестись расчет новой позиции. Однако вы не можете указать конкретную точку отсчета. Для установки третьего параметра нужно использовать представленные ниже константы. По умолчанию применяется SEEK_SET.

Константы положения курсора:

  • SEEK_SET - Начало файла.
  • SEEK_CUR - Текущее положение.
  • SEEK_END - Конец файла.

Принцип действия функции прост. Для файлового дескриптора рассчитывается новое местоположение указателя, которое является суммой значений второго и третьего параметра. Обратите особое внимание на возвращаемые значения. В случае успешного выполнения будет получено число «0», а при ошибке «-1».

//запишем в файл текст, а затем изменим положение указателя
$descriptor = tmpfile();
fwrite($descriptor, 'наши примеры довольно сумбурны');
fseek($descriptor, -33, SEEK_CUR);

//перезапишем текст, начиная с новой позиции
fwrite($descriptor, 'очень содержательны и полезны');
rewind($descriptor);
echo fgets($descriptor);

Последние публикации