Режимы "r+", "w+" и "a+" для текстовых файлов и режимы "r+b", "w+b" и "a+b" – для двоичных файлов, заданные в функции fopen(), позволяют переходить от чтения файла к записи в файл, не открывая файл повторно. При использовании этих режимов файл рассматривается как массив. Начало позиции считывания или записи задается с помощью указателя. Использование указателя позволяет обеспечить как последовательный доступ к данным (после считывания или записи очередного поля данных указатель автоматически перемещается на начало следующего поля данных), так и произвольный доступ к данным в файле (когда указатель перемещается прямо к началу нужного поля данных).
Функция
int ftell(int fp)
возвращает текущее смещение указателя чтения/записи от начала файла, либо значение false, если при выполнении функции произошла ошибка.
Функция
int fseek(int fp, int offset [, int whence])
устанавливает указатель в заданную параметрами offset и whence позицию. Параметр whence может принимать следующие значения:
· SEEK_SET – установить указатель в позицию offset от начала файла;
|
|
· SEEK_CUR – установить указатель в позицию offset от текущего положения;
· SEEK_END – установить указатель в позицию offset от конца файла.
По умолчанию параметр whence принимает значение SEEK_SET. Параметр offset может принимать как положительные, так и отрицательные значения.
В случае успешного выполнения функции возвращается значение 0. В случае неуспеха (в том числе и установка указателя за пределы файла) — значение -1.
Данная функция неприменима к файлам, открытым по протоколам HTTP и FTP.
Функция
bool rewind(int fp)
устанавливает указатель на начало файла. В случае успешного выполнения функции возвращается значение true, в противном случае – значение false.
Пример 4.6.150. Использование произвольного доступа к данным в файле:
В этом фрагменте программы доступ и изменение данных в файле Variables.txt, являющимся копией файла Variables.txt, созданного в примере 4.6.142, выполняется в режиме произвольного доступа:
// Переход в каталог "D:/PHPData/"
chdir("D:/PHPData/");
// Копирование файла Variables.txt в Variables1.txt
copy("Variables.txt", "Variables1.txt");
// Открытие файла Variables1.txt
// для чтения и записи
$modFile = fopen("D:/PHPData/Variables1.txt", "r+");
// Установка указателя в позицию 6
// относительно начала файла
fseek($modFile, 6);
// Получение и вывод значения переменной $b
$b = fread($modFile, 8);
print "\$b='$b'";
// Получение и вывод текущей позиции указателя
$currentPos = ftell($modFile);
print "\n\$currentPos=$currentPos";
// Возврат указателя на 8 позиций назад
fseek($modFile, -8, SEEK_CUR);
// Задание нового значения $b
$newB = 16.4;
// Запись нового значения $b в файл
fprintf($modFile, "%8.2e",$newB);
// Возврат указателя в начало файла
|
|
rewind($modFile);
// Установка указателя в позицию 31
// относительно начала файла
fseek($modFile, 31, SEEK_SET);
// Получение и вывод значения переменной $e
$e = fread($modFile, 6);
print "\n\$e='$e'";
// Задание нового значения $e
$NewE = 'string';
// Возврат указателя на 6 позиций назад
fseek($modFile, -6, SEEK_CUR);
// Запись нового значения $e в файл
fprintf($modFile, "%6s",$NewE);
В результате выполнения этого фрагмента выводятся следующие строки: