Чтение или запись в определенное место в файле

Задача
Необходимо читать из определенного места в файле (или записывать в него). Например, надо заменить третью запись в файле, состоящем из записей длиной 80 байт, поэтому требуется начинать запись со 161-го байта.

Решение
Функция fseek() позволяет переместиться на определенное количество байт, считая с начала файла, с конца файла или с текущей позиции в файле:

fseek($fh,26); // 26 байт, считая с начала файла
fseek($fh,26,SEEK_SET); // 26 байт, считая с начала файла
fseek($fh,-39,SEEK_END); // 39 перед концом файла
fseek($fh,10,SEEK_CUR); // 10 вперед, начиная с текущей позиции
fseek($fh,0); // начало файла

Функция rewind() перемещается в начало файла:

rewind($fh); // то же самое, что и fseek($fh,0)

Обсуждение
Функция fseek() возвращает 0, если она может перейти в указанную позицию, в противном случае она возвращает −1. Поиск за концом файла не является ошибкой для функции fseek(). А функция rewind(), столкнувшись с ошибкой, возвращает 0.

Функция fseek() может работать только с локальными файлами и не может с файлами, открытыми функцией fopen() по http или FTP.


Если функции fseek() передать дескриптор удаленного файла, то она выдаст ошибку E_NOTICE.

Для получения текущей позиции в файле применяется функция ftell():

if (0 === ftell($fh)) {
print "At the beginning of the file.";
}

Функция ftell() в случае ошибки возвращает false, поэтому необходим оператор === – для того, чтобы гарантировать, что ее возвращаемое значение действительно представляет целочисленный 0.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Блокировка файла
Выбор случайной строки из файла
Запись в несколько файловых дескрипторов одновременно
Запись в стандартный поток вывода
Непосредственная модификация файла без временной копии

Вернуться в раздел: PHP / 18. Файлы