Главная страница » Статьи и уроки » PHP статьи » PHP: файловые указатели. Выборочное извлечение информации.
Опрос
Какие статьи добавлять?
Выделенные и виртуальные серверы в Европе

PHP: файловые указатели. Выборочное извлечение информации.

Автор: administrator Дата: 28-04-2018, 19:07 Категория: Статьи и уроки / PHP статьи

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

При использовании функций чтения и записи, встроенных в PHP, нужно учитывать одну особенность. Файловый дескриптор, полученный вызовом fopen(), хранит в себе информацию о текущем местоположении указателя, также называемого курсором.
Указатель - это целочисленное значение, соответствующее порядковому номеру байта, от которого будет произведена следующая операция. Например, если вы создали файл и записали в него некоторое количество данных, то следующее добавление информации произойдет с места остановки предыдущей операции.
В PHP существует ряд функций, позволяющих управлять файловыми указателями. Это дает возможность выполнять чтение или запись, начиная с конкретного места. Они просты в понимании, но на практике используются редко. В большинстве случаев логика приложения не требует явного управления курсорами.
Важно!
Функции изменения положения курсора, рассматриваемые ниже, не будут иметь никакого эффекта, если файл был открыт в режиме доступа «a» или «a+». Операции записи в таком случае будут вестись только в конец файла.


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

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

//Покажем позицию указателя до и после записи
echo 'До записи: '. ftell($descriptor) .'
';
fwrite($descriptor, 'тестовая строка');
echo 'После записи: '. ftell($descriptor);
Заметка!
При проверке возвращаемого значения нужно осуществлять строгое сравнение. В PHP число «0», что соответствует началу файла, при использовании оператора «==», может быть преобразовано к false.

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

Для перевода указателя в начало файла нужно использовать функцию rewind(). Она принимает всего один параметр — дескриптор файла. Функция возвращает логическое значение true в случае успеха, а false при ошибке.
//запишем в файл текст, а затем сбросим указатель в начало
$descriptor = tmpfile();
fwrite($descriptor, 'временные файлы бывают очень удобны');
echo 'Конец строки в позиции: '. ftell($descriptor) .'
';

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);
  • Не нравится
  • 0
  • Нравится
Просмотров: 909 Напечатать Жалоба
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.
Написать комментарий
Ваше Имя:
Ваш E-Mail:
  • bowtiesmilelaughingblushsmileyrelaxedsmirk
    heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
    winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
    worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
    expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
    disappointedconfoundedfearfulcold_sweatperseverecrysob
    joyastonishedscreamtired_faceangryragetriumph
    sleepyyummasksunglassesdizzy_faceimpsmiling_imp
    neutral_faceno_mouthinnocent
Код: Кликните на изображение чтобы обновить код, если он неразборчив
Введите код: