Php прочитать файл в строку. Чтение и запись данных в файле

Последнее обновление: 1.11.2015

Как и большинство языков программирования, PHP поддерживает работу с файлами, которые являются одним из способов хранения информации.

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

Открытие и закрытие файлов

Для открытия файлов в PHP определена функция fopen() . Она имеет следующее определение: resource fopen(string $filename, string $mode) . Первый параметр $filename представляет путь к файлу, а второй - режим открытия. В зависимости от цели открытия и типа файла данный параметр может принимать следующие значения:

    "r" : файл открывается только для чтения. Если файла не существует, возвращает false

    "r+" : файл открывается только для чтения с возможностью записи. Если файла не существует, возвращает false

    "w" : файл открывается для записи. Если такой файл уже существует, то он перезаписывается, если нет - то он создается

    "w+" : файл открывается для записи с возможностью чтения. Если такой файл уже существует, то он перезаписывается, если нет - то он создается

    "a" : файл открывается для записи. Если такой файл уже существует, то данные записываются в конец файла, а старые данные остаются. Если файл не существует, то он создается

    "a+" : файл открывается для чтения и записи. Если файл уже существует, то данные дозаписываются в конец файла. Если файла нет, то он создается

Результатом функции fopen будет дескриптор файла. Этот дескриптор используется для операций с файлом и для его закрытия.

После окончания работы файл надо закрыть с помощью функции fclose() , которая принимает в качестве параметра дескриптор файла. Например, откроем и закроем файл:

$fd = fopen("form.php", "r") or die("не удалось открыть файл"); fclose($fd);

Конструкция or die("текст ошибки") позволяет прекратить работу скрипта и вывесте некоторое сообщение об ошибке, если функция fopen не смогла открыть файл.

Чтение файла

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

При каждом вызове fgets() PHP будет помещать указатель в конец считанной строки. Чтобы проследить окончание файла, используется функция feof() , которая возвращает true при завершении файла. И пока не будет достигнут конец файла, мы можем применять функцию fgets().

Чтение файла полностью

При этом нам не надо открывать явно файл, получать дескриптор, а затем закрывать файл.

Поблочное считывание

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

Функция fread() принимает два параметра: дескриптор считываемого файла и количество считываемых байтов. При считывании блока указатель в файле становится в конец этого блока. И также с помощью функции feof() можно отследить завершение файла.

Запись файла

Для записи файла применяется функция fwrite() , которая записывает в файл строку:

Аналогично работает другая функция fputs() :

Работа с указателем файла

При открытии файла для чтения или записи в режиме "w", указатель в файле помещается в начало. При считывании данных PHP перемещает указатель в файле в конец блока считанных данных. Однако мы также вручную можем управлять указателем в файле и устанавливать его в произвольное место. Для этого надо использовать функцию fseek , которая имеет следующее формальное определение:

Int fseek (resource $handle , int $offset [, int $whence = SEEK_SET ])

Параметр $handle представляет дескриптор файла. Параметр $offset - смещение в байтах относительно начала файла, с которого начнется считывание/запись. Третий необязательный параметр задает способ установки смещения. Он может принимать три значения:

    SEEK_SET : значение по умолчанию, устанавливает смещение в offset байт относительно начала файла

    SEEK_CUR : устанавливает смещение в offset байт относительно начала текущей позиции в файле

    SEEK_END : устанавливает смещение в offset байт от конца файла

В случае удачной установки указателя функция fseek() возвращает 0, а при неудачной установке возвращает -1.

Пример использования функции:

$fd = fopen("hello.txt", "w+") or die("не удалось открыть файл"); $str = "Привет мир!"; // строка для записи fwrite($fd, $str); // запишем строку в начало fseek($fd, 0); // поместим указатель файла в начало fwrite($fd, "Хрю"); // запишем в начало строку fseek($fd, 0, SEEK_END); // поместим указатель в конец fwrite($fd, $str); // запишем в конце еще одну строку fclose($fd);

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

Чтение из файла

Функцию fread() можно использовать для получения определённого количества данных из файла.

fread (файл, длина)

Параметры:

файл - дескриптор файла

длина - размер данных в байтах

Если конец файла будет достигнут раньше, чем функция прочитает указанный размер данных, то она вернёт строку меньшего размера. Данную функцию удобно применять для чтения бинарных файлов.

При указании длины строки и при перемещении указателя нужно учитывать, что русские буквы имеют размер не один байт, а больше. в теме "Работа со строками". Также не забудте, что в начале файла в кодировке UTF-8 есть несколько байт. В кодировке UTF-8 без BOM эти байты отсутствуют.

Прочитаем перыве 10 байт из файла myfile.txt. Откроем его в режиме "r+". Указатель будет находится в начале.

$file = fopen("myfile.txt", "r+"); $take = fread($file, 10); echo $take;

Если в файле присутствуют русские буквы, то последняя буква может отображаться неправильно. Это происходит потому, что символ имеет размер больше одного байта и одна часть прочитана, а вторая нет.

Функция fgets() возвращает одну строку, начиная от указателя до конца строки.

fgets (файл, длина)

Параметры:

файл - дескриптор файла

длина - позволяет указать размер строки в байтах. При этом, если будет достигнут конец строки, то следующая строка не входит в результат работы функции, даже если строка будет меньше указанной длины. Необязательный параметр.

Если длина не указана, то в старых версиях PHP максимальная длина возвращаемой строки была ограничена. В более новых версиях этого ограничения нет.

Запуск функции в цикле позволяет произвести чтение файла построчно.

Прочитаем одну строку строку из файла myfile.txt. Так как указатель уже перемещён, то будет прочитана не вся строка, а от указателя.

$take = fgets($file); echo "
".$take;

Функция fgetss() также возвращает одну строку, но удаляет из неё HTML теги. Если в коде присутствует PHP скрипт, то он тоже будет удалён.

fgetss (файл, длина, нужные тэги)

Параметры:

файл - дескриптор файла

длина - размер строки в байтах. Необязательный параметр.

нужные теги - позволяет указать тэги, которые не будут удалены.

Существует функция fgetc() , которая возвращает один символ из файла.

Функция file() читает весь файл и помещает данные в массив. Каждая строка помещается в элемент массива. Для работы этой функции не требуется открывать файл. Расположение указателя не учитывается.

file (путь к файлу, флаги, контекст)

Параметры:

путь к файлу - абсолютный или относительный путь к файлу

флаги - флаги, определяющие работу функции. Необязательный параметр.

контекст - позволяет указать ресурс контекста

Можно указать такие флаги:

FILE_USE_INCLUDE_PATH - позволяет искать файл в папках include path.

FILE_IGNORE_NEW_LINES - удаляет символ конца строки. Если этот флаг не установлен, то в каждой строке будет символ конца строки.

FILE_SKIP_EMPTY_LINES - не добавляет в массив пустые строки.

Если указывается несколько флагов, то они разделяются оператором "|".

Выведем файл myfile.txt на страницу.

$ar = file("myfile.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); echo "
"; print_r($ar);

Запись в файл

Функция fwrite() записывает данные в файл.

fwrite (файл, данные, длина)

Параметры:

файл - дескриптор файла

данные - данные, которые записываются

длина - максимальный размер записываемых данных в байтах. Может быть записана не вся строка, а только указанное количество байт. Необязательный параметр.

Если указатель находится в начале или середине файла, функция заменяет символы, находящиеся в файле, на новые. То есть, если записывается 5 символов, то из файла удаляются 5 символов и на их место добавляются новые.

Когда вы записываете русские буквы, то кодировка скрипта должна соответствовать кодировке файла.

Запишем в файл строку "текст из скрипта". В нашем примере дескрептор находится в середине файла и строка запишется туда. Когда нужно добавить данные в конец файла, то его можно открыть в режиме "a". А когда нужно перезаписать файл, его открывают в режиме "w". Мы не будем передвигать указатель, запишем данные туда, где он находится.

$text = "текст из скрипта"; fwrite($file, $text);

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

Работа с файлами разделяется на 3 этапа:

  1. Открытие файла.
  2. Манипуляции с данными.
  3. Закрытие файла.

I . Открытие файла

Для того чтобы открыть файл в среде PHP используется функция fopen() . Обязательными параметрами этой функции является имя файла и режим файла.

$fp = fopen("counter.txt", "r");

Согласно документации PHP выделяют следующие виды режимов файлов:

  1. r – открытие файла только для чтения.
  2. r+ - открытие файла одновременно на чтение и запись.
  3. w – создание нового пустого файла. Если на момент вызова уже существует такой файл, то он уничтожается.
  4. w+ - аналогичен r+, только если на момент вызова фай такой существует, его содержимое удаляется.
  5. a – открывает существующий файл в режиме записи, при этом указатель сдвигается на последний байт файла (на конец файла).
  6. a+ - открывает файл в режиме чтения и записи при этом указатель сдвигается на последний байт файла (на конец файла). Содержимое файла не удаляется.

Примечание: в конце любой из строк может существовать еще один необязательный параметр: b или t . Если указан b , то файл открывается в режиме бинарного чтения/записи. Если же t , то для файла устанавливается режим трансляции перевода строки, т.е. он воспринимается как текстовый.

Для демонстрации рассмотрим следующий сценарий:

//Открывает файл в разных режимах
$fp = fopen("counter.txt", "r"); // Бинарный режим
$fp = fopen("counter.txt", "rt"); // Текстовый режим
$fp = fopen("http://www.yandex.ru", "r");// Открывает HTTP соединение на чтение
$fp = fopen("ftp://user:[email protected]", "w"); //Открываем FTP соединение с указанием логина и пароля
?>

II . Манипуляции с данными файла

Записывать данные в файл при помощи PHP можно при помощи функции fwrite() . Это функция принимает 2 обязательных параметра и 1 необязательный. В качестве обязательных параметров выступает дескриптор файла и режим файла:

$fp = fopen("counter.txt", "a"); // Открываем файл в режиме записи
$mytext = "Это строку необходимо нам записать\r\n"; // Исходная строка
$test = fwrite($fp, $mytext); // Запись в файл
if ($test) echo "Данные в файл успешно занесены.";
else echo "Ошибка при записи в файл.";
fclose($fp); //Закрытие файла
?>

Для построчного считывания файла используют функцию fgets() . Функция принимает 2 обязательных параметра:


if ($fp)
{
while (!feof($fp))
{
$mytext = fgets($fp, 999);
echo $mytext."
";
}
}

fclose($fp);
?>

Примечание: В данном примере значение 999 определяет количество символов, которые будут считываться до тех пор, пока указатель не достигнет конца файла (EOF).

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

echoreadfile("counter.txt");
?>

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

$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
if ($fp) echo fpassthru($fp);
elseecho "Ошибка при открытии файла";
?>

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

Примечание: Не следует применять функцию file() к двоичным файлам (binary-safe), т.к. она не является безопасной в плане считывания двоичных файлов, если при этом, где-то встретиться символ конца файла (EOF), то она не гарантирует вам чтение всего двоичного файла.

$file_array = file("counter.txt"); // Считывание файла в массив $file_array
// Работа с данными массива
?>

Примечание: Работа с массивами подробно описывается , авторы: Мухаметшин Д.Ф., Симдянов И.В.

В конце статьи, вы найдете хороший «сборник рецептов» по массивам, который дает решение многих проблем, с которыми ежедневно встречается веб-программист.

Давайте представим ситуацию, когда файл необходимо считать по символам. Для этого мы можем воспользоваться функцией fgetc() . Функция принимает единственный параметр. Функция полезна если нам необходимо найти какой-либо символ или количество одинаковых символов.

$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
if ($fp)
{
while(!feof($fp))
{
$char = fgetc($fp);
if ($char == "с") $i = $i + 1;// Находим символ «с»
}
echo "Количество букв "c" в файле: ". $i;
}
else echo "Ошибка при открытии файла";
?>

III . Закрытие файла

Закрытие файла происходить с помощью функции fclose() , которая принимает 1 обязательный параметр.

$fp = fopen("counter.txt", "r");
if ($fp)
{
echo "Файл открыт";
fclose($fp); // Закрытие файла
}
?>

Сборник рецептов

1) Нам необходимо проверить существует ли тот или иной файл. Для этого мы воспользуемся функцией file_exists() .

myfile("counter.txt"); // Используем функцию myfile, передав в качестве аргумента имя файла

function myfile($name) //Создаем функцию для проверки существования файла
{
if (file_exists($name)) echo "Файл существует";

}
?>

Примечание: Функция file_exists не производит проверку файлов на удаленном веб-сервере. Для правильной работы функции, файл со скриптом должен находиться на том сервере, где и проверяемый файл.

2) Определяем размер файла с помощью функции filesize ()

myfile("counter.txt");

function myfile($name) //Создаем функцию для проверки существования файла и определения размера файла
{
if (file_exists($name)) echo "Размер файла: ".filesize($name)." байт";
else echo "Файл не существует";
}
?>

3) Создание временного файла с помощью функции tmpfile ()

$myfile = tmpfile();
fwrite($myfile, "Эта строка записывается во временный файл."); // Записываем во временный файл
fseek($myfile, 0); // Устанавливаем указатель файла
echo fread($myfile, 1024); // выводим содержимое файла
?>

4) Вам необходимо определить количество строк в файле. Для этого используем функцию count ()

$fp = file("counter.txt");
echo "Количество строк в файле: ".count($fp);
?>

5) Нам необходимо использовать механизм блокировки файла

$fp = fopen("counter.txt", "a");
flock($fp, LOCK_EX); // Блокирование файла для записи
fwrite($fp, "Строка для записи");
flock($fp, LOCK_UN); // Снятие блокировки
fclose($fp);
?>

6) Нам необходимо удалить определенную строку из файла

$num_stroka = 5; //Удалим 5 строку из файла
$file = file("counter.txt"); // Считываем весь файл в массив

for($i = 0; $i < sizeof($file); $i++)
if($i == $num_stroka) unset($file[$i]);

$fp = fopen("counter.txt", "w");
fputs($fp, implode("", $file));
fclose($fp);
?>

7) Определение типа файла. Используем функцию

В предыдущем уроке мы научились использовать РНР для доступа к файловой системе сервера. В этом уроке используем эту информацию для чтения из простого текстового файла.

Текстовые файлы отлично подходят для хранения разного рода данных. Они не так гибки, как базы данных, но обычно не требую такого количества памяти. Более того, текстовые файлы имеют формат, который читается на большинстве систем.

Открыть текстовый файл

Для открытия текстового файла используем функцию fopen . Вот её синтаксис:

Fopen(filename, mode )

Filename Имя открываемого файла. mode Mode/Режим может быть "r" (reading/чтение), "w" (writing/запись) или "a" (appending/присоединение). В этом уроке мы будем только читать из файла и, соответственно, используем "r". В следующем уроке мы научимся записывать и присоединять текст.

Примеры этого урока используют файл unitednations.txt . Это простой список программ и фондов ООН и их доменов. Можете загрузить этот файл или создать свой и использовать его в примерах.

Сначала попробуем открыть unitednations.txt:

// Открыть текстовый файл // Закрыть текстовый файл fclose($f); ?>

Пример 1: Чтение строки из текстового файла

В файле систематизированно записаны: название программы, запятая, домен. Как вы, вероятно, могли предположить, в файле с разделением запятыми можно записать куда больше информации.

Для получения информации из каждой строки используем массив. См. в Уроке 8 о массивах.

Чтение из текстовых файлов $f = fopen("unitednations.txt", "r"); // Читать построчно до конца файла while (!feof($f)) { // Создать массив с запятой-разделителем $arrM = explode(",",fgets($f)); // Записать ссылки (получить данные из массива) echo "

  • " . $arrM. "
  • "; } fclose($f); ?>

    Весьма удобно, правда? В принципе вы можете расширить этот файл сотнями ссылок или расширить директорию, включив также адреса.

    В следующем уроке мы мы посмотрим, как записать в текстовый файл.

    В общем виде взаимодействие с файлами в PHP сводится к открытию файла, выполнению с ними необходимых действий и закрытию файла. При открытии файла определяется режим дальнейшей с ним работы. Это может быть открытие для чтения, записи, добавления данных. Есть так же режимы открытия файла, совмещающие в себе одновременно и чтение и запись.

    Существует множество возможностей выполнять чтение из файлов – можно получить данные в разной форме – построчное считывание, получение массива строк и так далее.

    Создание и запись файла

    Для создания файла, необходимо выполнить открытие файла в режиме записи. Открытие файла выполняется функцией fopen . Первым параметром этой функции указывает путь к файлу. Второй параметр указывает на режим открытия файл. Для создания файла нужно указать режим записи файла - "w".

    $f = fopen("myfile.txt" , "w" );

    Если файл с таким именем уже есть, то режим записи позволит создать новый пустой файл на месте существующего, удалив все его данные.

    * Еще существует параметр "w+" , позволяющий, открывать одновременно для чтения и записи. При этом, если файл с таким именем уже существовал, данные в нем сотрутся.

    При выполнении операции открытия, функция вернет значение – дескриптора файла – специальной файловой переменная, которая будет указывать последующим функциям с каким именно файлом выполнять свои действия.

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

    fwrite($f, "Мой текст для записи в файл." );

    После записи всех строк, его необходимо закрыть. Для этого применяется функция fclose . Единственным параметром для нее служит дескриптор файла.

    fclose($f);

    В итоге, код создания и сохранения файла выглядит следующим образом:

    $f = fopen("myfile.txt" , "w" );
    fwrite($f, "Первая строка.\r\n" );
    ...
    fwrite($f, "Последняя строка.\r\n" );
    fclose($f);

    * Символы "\r\n" означают символ конца строки. Если не добавлять, все строки в записанном файле объединятся в одну строку.

    Добавление данных в существующий файл

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

    $f = fopen("myfile.txt" , "a" ); "// Параметр "a" указывает открыть в режиме добавления"
    fwrite($f, "Новая строка\r\n" );
    fclose($f);

    Если же файла с указанным именем не существует, файл будет создан и все данные будут записаны в него.

    * Еще есть режим "a+" , открывающий файл для чтения и записи, с переходом в конец файла.

    Чтение из файла

    Для чтения из файла, функции fopen назначается параметр "r", что означает, что файл будет открыт только для чтения. Чтение из файла выполняет функция fgets . Первым параметром указывается дескриптор файла. Второй, необязательный, параметр определяет размер считываемой строки. Если второй параметр не указывать, текущая строка будет считана до символа конца строки.

    $f = fopen("myfile.txt" , "r" ); // Параметр "r" указывает открыть в режиме чтения
    $s = fgets($f);
    echo $s;
    fclose($f);

    * Режим "r+" открывает файл для чтения и записи.

    Для считывания всех строк из файла, можно воспользоваться циклом, в котором будет считываться по одной строке до конца файла:

    $f = fopen("myfile.txt" , "r" );
    while (!feof($f)){
    $s = fgets($f);
    echo $s;
    }
    fclose($f);

    Функция feof используется в условии цикла для определения конца файла и завершения цикла считывания.

    Кроме описанного метода получения данных из файла, PHP имеет еще множество различных функций. Иногда проще получить стразу все содержимое файла (функция readfile) или загрузить все строки в массив (функция file), и работать уже с ним. Для таких целей не придется открывать файл для чтения и закрывать его. Все эти действия будут выполнены самой функцией.

    readfile("myfile.txt" );

    $mas = file("myfile.txt" );

    foreach ($mas as $m)
    echo $m;

    С помощью функции fgetc можно считывать содержимое файла посимвольно:

    $f = fopen("myfile.txt" , "r" );
    while (!feof($f)){
    $s = fgetc($f);
    echo $s;
    }
    fclose($f);

    Удаление файла

    Удаление файла выполняется функцией unlink . В параметре указывается путь к удаляемому файлу.

    unlink("myfile.txt" );

    Проверка существует ли файл

    Иногда, прежде чем, выполнять какие-либо действия с файлом необходимо проверить, существует ли он. Для этого используется функция file_exists . В параметре указывается путь к файлу.

    if (file_exists("myfile.txt" ))
    echo "Такой файл есть." ;
    else
    echo "Файла с таким именем нет." ;