| |
функции для установки этой самой позиции в любое место файла.
После того как файл успешно открыт, из него (при помощи дескриптора файла) мож-
но читать, а также, при соответствующем режиме открытия, писать. Обмен данными
осуществляется через обыкновенные строки и, что важнее всего, начиная с позиции
указателя файла. В следующих разделах рассматриваются несколько функций для
чтения/записи.
Блочные чтение/запись
string fread(int $f, int $numbytes)
Глава 15. Работа с файлами 251
Читает из файла $f $numbytes символов и возвращает строку этих символов. После
чтения указатель файла продвигается к следующим после прочитанного блока пози-
циям (это происходит и для всех остальных функций, так что дальше я буду
пропус-
кать такие подробности). Разумеется, если $numbytes больше, чем можно прочитать
из файла (например, раньше достигается конец файла), возвращается то, что
удалось
считать. Этот прием можно использовать, если вам нужно считать в строку файл
це-
ликом. Для этого просто задайте в $numbytes очень большое число (например, сто
тысяч). Но если вы заботитесь об экономии памяти в системе, так поступать не
реко-
мендуется. Дело в том, что в некоторых версиях PHP передача большой длины
строки
во втором параметре fread() вызывает первоначальное выделение этой памяти в
соответствии с запросом (даже если строка гораздо короче). Конечно, потом
лишняя
память освобождается, но все же ее может и не хватить для начального выделения.
int fwrite(int $f, string $st)
Записывает в файл $f все содержимое строки $st. Эта функция составляет пару для
fread(), действуя "в обратном направлении".
Например, с помощью описанных двух функций можно копировать файлы
(правда, в PHP есть для этого отдельная функция — copy()), считав файл
целиком посредством fread() и затем записав в новое место при помощи
fwrite().
При работе с текстовыми файлами (то есть когда указан символ t в режиме
открытия
файла) все \n автоматически преобразуются в тот разделитель строк, который
принят
в вашей операционной системе.
Построчные чтение/запись
string fgets(int $f, int $length)
Читает из файла одну строку, заканчивающуюся символом новой строки \n. Этот
символ также считывается и включается в результат. Если строка в файле занимает
больше $length-1 байтов, то возвращаются только ее $length-1 символов. Функ-
ция полезна, если вы открыли файл и хотите "пройтись" по всем его строкам.
Однако
даже в этом случае лучше (и быстрее) будет воспользоваться функцией File(), ко-
торая рассматривается ниже. Стоит также заметить, что эта функция (ровно как и
функция fread()) в случае текстового режима) в Windows заботится о преобразо-
вании пар \r\n в один символ \n, так что будьте внимательны при работе с
тексто-
выми файлами в этой операционной системе.
int fputs(int $f, string $st)
Эта функция — полный аналог fwrite(). В официальной документации по PHP
описания обеих функций просто совпадают, но там ничего не сказано про то, что
Часть IV. Стандартные функции PHP 252
функции являются синонимами. Что ж... Несмотря на это, я все-таки рискну выдви-
нуть такое предположение.
Чтение CSV-файла
Программа Excel из Microsoft Office стала настолько популярна, что в PHP даже
встроили функцию для работы с одним из форматов файлов, в которых может сохра-
нять данные Excel. Часто она бывает довольно удобна и экономит пару строк
допол-
нительного кода.
list fgetcsv(int $f, int $length, char $delim=’,’)
Функция читает одну строку из файла, заданного дескриптором $f, и разбивает ее
по
символу $delim. Параметр $delim должен обязательно быть строкой из одного сим-
вола, в противном случае принимается во внимание только первый символ этой
стро-
ки. Функция возвращает получившийся список или false, если строки кончились.
Параметр $length задает максимальную длину строки точно так же, как это делает-
ся в fgets(). Пустые строки в файле не игнорируются, а возвращаются как список
из одного элемента — пустой строки.
Функция fgetcsv() работает чуть
|
|