Опубликован: 01.03.2005 | Доступ: свободный | Студентов: 33882 / 4520 | Оценка: 4.31 / 4.06 | Длительность: 16:41:00
ISBN: 978-5-9556-0026-0
Лекция 9:

Работа с файловой системой

Чтение данных из файла

Если мы хотим прочитать данные из существующего файла, одной функции fopen(), как и в случае с записью данных, недостаточно. Она лишь возвращает указатель на открытый файл, но не считывает ни одной строки из этого файла. Поэтому для того, чтобы прочитать данные из файла, нужно воспользоваться одной из специальных функций: file, readfile, file_get_contents, fread, fgets и т.п.

Функция fread

Эта функция осуществляет чтение данных из файла. Ее можно использовать и для чтения данных из бинарных файлов, не опасаясь их повреждения. Синтаксис fread() такой:

string fread (указатель на файл, длина)

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

В результате работы функция fread() возвращает строку со считанной из файла информацией.

Как вы заметили, в этой функции параметр длина - обязательный. Следовательно, если мы хотим считать весь файл в строку, нужно знать его длину. PHP может самостоятельно вычислить длину указанного файла. Для этого нужно воспользоваться функцией filesize(имя файла). В случае ошибки эта функция вернет false. К сожалению, ее можно использовать только для получения размера локальных файлов.

Пример 9.4. Прочитаем содержимое файла my_file.html

<?php
$h = fopen("my_file.html","r+");    
// открываем файл на запись и чтение
$content = fread($h, 
     filesize("my_file.html"));
// считываем содержимое файла в строку
fclose($h); // закрываем соединение с файлом
echo $content; 
// выводим содержимое файла 
// на экран браузера
?>
Пример 9.4. Использование функции fread()

Для того чтобы считать содержимое бинарного файла, например изображения, в таких системах, как Windows, рекомендуется открывать файл с помощью флага rb или ему подобных, содержащих символ b в конце.

Функция filesize() кэширует результаты своей работы. Если изменить содержимое файла my_file.html и снова запустить приведенный выше скрипт, то результат его работы не изменится. Более того, если запустить скрипт, считывающий данные из этого файла с помощью другой функции (например, fgets ), то результат может оказаться таким, как если бы файл не изменился. Чтобы этого избежать, нужно очистить статический кэш, добавив в код программы команду clearstatcache() ;

Функция fgets

С помощью функции fgets() можно считать из файла строку текста. Синтаксис этой функции практически такой же, как и у fread(), за исключением того, что длину считываемой строки указывать необязательно:

string fgets ( указатель на файл, [ длина])

В результате работы функция fgets() возвращает строку длиной ( длина-1 ) байт из файла, на который указывает указатель на файл. Чтение заканчивается, если прочитано ( длина-1 ) символов или встретился символ перевода строки или конец файла. Напомним, что в PHP один символ - это один байт. Если длина считываемой строки не указана (данная возможность появилась начиная с PHP 4.2.0), то считывается 1 Кбайт (1024 байт) текста или, что то же самое, 1024 символа. Начиная с версии PHP 4.3, если параметр длина не задан, считывается строка целиком. В случае ошибки функция fgets() возвращает false. Для версий PHP начиная с 4.3 эта функция безопасна для двоичных файлов.

<?php
$h = fopen("my_file.html","r+"); 
$content = fgets($h,2); 
// считает первый символ из 
// первой строки файла my_file.html
fclose($h);
echo $content;
?>
Пример 9.5. Использование функции fgets()

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

Например, вот так можно считать все строки файла my_file.html:

<?php
$h = fopen("my_file.html","r"); 
while (!feof ($h)) {
    $content = fgets($h);
    echo $content,"<br>";
}
fclose($h);
?>

Функция fgetss

Существует разновидность функции fgets() - функция fgetss(). Она тоже позволяет считывать строку из указанного файла, но при этом удаляет из него все встретившиеся html-теги, за исключением, быть может, некоторых. Синтаксис fgetss() такой:

string fgetss(указатель на файл, 
   длина [, допустимые теги])

Обратите внимание, что здесь аргумент длина обязательный.

Пример 9.6. Пусть у нас имеется файл my_file.html следующего содержания:

<h1>Без труда не вынешь и рыбку из пруда.</h1>
<b>Тише едешь - дальше будешь</b> У семи нянек<i> дитя без глазу</i>.

Выведем на экран все строки файла my_file.html, удалив из них все теги, кроме <b> и <i>:

<?php
$h = fopen("my_file.html","r");
while (!feof ($h)) {
    $content = fgetss($h,1024,'<b><i>');
   echo $content,"<br>";
}
fclose($h);
?>
Пример 9.6. Использование функции fgetss()

В результате работы этого скрипта получим:

Без труда не вынешь и рыбку из пруда. Тише едешь - дальше будешь  У семи нянек дитя без глазу.
Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Виктор Родин
Виктор Родин
Россия
Отабек Салохиддинов
Отабек Салохиддинов
Узбекистан, Andijan, 6-школа, 2011