﻿
<h1 class=p1>Чтение из файлов и запись в файлы</h1>
<br>
<br>

<h2 class=p1>Чтение из файлов</h2>
<p class=text>Прочитать строку из открытого файла можно с помощью функции <b>fread</b>:</p>
<blockquote><pre>
  <em class=gr>string</em> <b>fread</b> <em class=gr>( int</em> <b>file</b>, <em class=gr>int</em> <b>length</b><em class=gr> )</em>
</pre></blockquote>
<p class=text>Эта функция возвращает строку длиной <b>length</b> символов из файла с дескриптором <b>file</b>. </p>
<p class=prim><b>Пример (чтение из файла):</b></p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>$file</b> <em class=gr>=</em> <b>fopen</b><em class=gr>(</em>"c:/www/html/file.txt","r"<em class=gr>);
  if(</em>!<b>file</b><em class=gr>)
    {
      echo(</em>"Ошибка открытия файла"<em class=gr>);
    }
    else
    {</em>
      <b>$buff</b><em class=gr> =</em> <b>fread</b> <em class=gr>(</em><b>$file</b>,100<em class=gr>);
      print</em><b> $buff</b><em class=gr>;
    }</em>
<em class=red>?&gt;</em>
</pre></blockquote>
<p class=text>Для чтения из файла можно также пользоваться функцией <b>fgets</b>:</p>
<pre><blockquote>
   <em class=gr>string</em> <b>fgets</b> <em class=gr>( int</em> <b>file</b>, <em class=gr>int</em> <b>length</b><em class=gr>)</em>
</pre></blockquote>

<p class=text>Эта функция читает и возвращает строку длиной <b>length - 1</b> байт. Чтение прекращается, когда достигнута новая строка или конец файла. При достижении конца файла функция возвращает пустую строку.</p>
<p class=text>Для чтения файла с удалением из него тегов HTML применяется функция <b>fgetss</b>:</p>
<pre><blockquote>
   <em class=gr>string</em> <b>fgetss</b> <em class=gr>(int</em> <b>file</b>, <em class=gr>int</em> <b>length</b> <em class=gr>[, string</em> <b>allowable_tags</b><em class=gr>])</em>
</pre></blockquote>

<p class=text>Необязательный третий параметр <b>allowable_tags</b> может содержать строку со списком тегов, которые не должны быть отброшены, при этом теги в строке записываются через запятую. </p>
<p class=text>Если необходимо записать содержимое файла в массив, применяется функция <b>file</b>:</p>
<pre><blockquote>
   <em class=gr>array</em> <b>file</b> <em class=gr>(string</em> <b>filename</b> <em class=gr>[, int</em> <b>use_include_path</b><em class=gr>])</em>
</pre></blockquote>

<p class=text>Функция считывает файл с именем <b>filename</b> и возвращает массив, каждый элемент которого соответствует строке в прочитанном файле. В следующем примере с помощью функции читается файл, информация из которого затем выводится в браузер.</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>$file_array</b><em class=gr> = file(</em>"file.txt"<em class=gr>);
  if(</em><b>!$file_array</b><em class=gr>)
  {
    echo(</em>"Ошибка открытия файла"<em class=gr>);
  }
  else
  {
    for(</em><b>$i</b><em class=gr>=</em>0;<b> $i</b><em class=gr> <</em> <b>count</b><em class=gr>(</em><b>$file_array</b><em class=gr>)</em>;<b> $i++</b><em class=gr>)
    {
      printf(</em>"%s&lt;br>", <b>$file_array</b>[<b>$i</b>]<em class=gr>);
    }
  }</em>
<em class=red>?&gt;</em>
</pre></blockquote>

<p class=text>Эта функция удобна также тем, что с ее помощью можно легко подсчитать количество строк в файле:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>$file_array</b><em class=gr> = </em> <b>file</b> <em class=gr>(</em>"file.txt"<em class=gr>);
  if(</em><b>!$file_array</b><em class=gr>)
  {
    echo(</em>"Ошибка открытия файла"<em class=gr>);
  }
  else
  {</em>
    <b>$num_str</b><em class=gr> = </em> <b>count</b><em class=gr>(</em><b>$file_array</b><em class=gr>); 
    echo(</em><b>$num_str</b><em class=gr>);
  }</em>
<em class=red>?&gt;</em>
</pre></blockquote>
<p class=text>Заметим, что функцию <b>file</b> следует применять лишь для чтения небольших файлов.</p>
<p class=text>Для чтения файлов с расширением <i>*.csv</i> применяется функция <b>fgetcsv</b>:</p>
<blockquote><pre>
  <em class=gr>array</em> <b>fgetcsv</b> <em class=gr>( int</em> <b>file</b>, <em class=gr>int</em> <b>length</b>, <em class=gr>char</em> <b>delim</b><em class=gr>)</em>
</pre></blockquote>

<p class=text>Функция читает строку из файла и разбивает ее по символу <b>delim</b>. Параметр delim должен обязательно быть строкой из одного символа, иначе принимается во внимание только первый символ этой строки. Функция возвращает получившийся массив или false, если достигнут конец файла. Пустые строки в файле не игнорируются, а возвращаются как массив из одного элемента - пустой строки. Параметр <b>length</b> задает максимальную длину строки точно так же, как это делается в функции <b>fgets</b>. </p>
<p class=text>Формат CSV является одним из форматов, в котором может сохранять файлы MSExcel. В следующем  примере производится чтение созданного MSExcel файла file.csv, содержащего пароли пользователей.</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>$count</b><em class=gr> = </em>1<em class=gr>;</em>
  <b>$file</b><em class=gr> = </em> <b>fopen</b> <em class=gr>(</em>"file.csv","r"<em class=gr>);
  while (</em><b>$data</b><em class=gr> = </em><b>fgetcsv</b> <em class=gr>(</em><b>$file</b>, 1000, ","<em class=gr>)) 
  {</em>
    <b>$num</b><em class=gr> = </em><b>count</b> <em class=gr>(</em><b>$data</b><em class=gr>);</em>
    <b>$count</b>++<em class=gr>;
    for (</em><b>$i</b><em class=gr>=</em>0; <b>$i</b> &lt; <b>$num</b>; <b>$i</b>++<em class=gr>) 
    {
      print</em> "<b>$data</b>[<b>$i</b>]&lt;br>"<em class=gr>;
    }
  }</em>
  <b>fclose</b> <em class=gr>( </em><b>$file</b><em class=gr> );</em>
<em class=red>?&gt;</em>
</pre></blockquote>

<br><h2 class=p1>Запись в файлы</h2>
<p class=text>Запись в файлы осуществляется функциями <b>fputs</b> и <b>fwrite</b>, которые абсолютно идентичны:</p>
<blockquote><pre>
  <em class=gr>int</em> <b>fputs</b> <em class=gr>( </em>int <b>file</b>, <em class=gr>string</em> <b>string</b> <em class=gr>[, int</em> <b>length </b><em class=gr>])</em>
  <em class=gr>int</em> <b>fwrite</b> <em class=gr>( </em>int <b>file</b>, <em class=gr>string</em> <b>string</b> <em class=gr>[, int</em> <b>length </b><em class=gr>])</em>
</pre></blockquote>
<p class=text>Первый аргумент - дескриптор файла, в который осуществляется запись. Второй аргумент представляет собой строку, которая должна быть записана в файл. Третий необязательный аргумент задает количество символов в строке, которые должны быть записаны. Если третий аргумент не указан, записывается вся строка.</p>
<p class=text>В этом примере в файл "file.txt" записывается строка "Hello, world!"</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>$file</b><em class=gr> = fopen (</em>"file.txt","r+"<em class=gr>);</em>
  <b>$str</b><em class=gr> = </em>"Hello, world!"<em class=gr>;
  if ( </em><b>!$file</b><em class=gr> )
  {
    echo(</em>"Ошибка открытия файла"<em class=gr>);
  }
  else
  {</em>
    <b>fputs</b> <em class=gr>( </em><b>$file</b>, <b>$str</b><em class=gr>);
  }</em>
  <b>fclose</b> <em class=gr>(</em><b>$file</b><em class=gr>);</em>
<em class=red>?&gt;</em>
</pre></blockquote>
