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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

Прочитать строку из открытого файла можно с помощью функции fread:

string fread (int file, int length )

Эта функция возвращает строку длиной length символов из файла с дескриптором file.

Пример (чтение из файла):

<? $file = fopen ( "c:/www/html/file.txt","r" ); if(!file ) { echo( "Ошибка открытия файла" ); } else { $buff = fread ( $file,100 ); print $buff; }?>

Для чтения из файла можно также пользоваться функцией fgets:

string fgets (int file, int length )

Эта функция читает и возвращает строку длиной length - 1 байт. Чтение прекращается, когда достигнута новая строка или конец файла. При достижении конца файла функция возвращает пустую строку.

Для чтения файла с удалением из него тегов HTML применяется функция fgetss:

string fgetss (int file, int length [, string allowable_tags ])

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

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

array file (string filename [, int use_include_path ])

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

<? $file_array = file( "file.txt" ); if(!$file_array ) { echo( "Ошибка открытия файла" ); } else { for( $i = 0; $i < count ( $file_array ); $i++ ) { printf( "%s<br>", $file_array[$i] ); } }?>

Эта функция удобна также тем, что с ее помощью можно легко подсчитать количество строк в файле:

<? $file_array =  file ( "file.txt" ); if(!$file_array ) { echo( "Ошибка открытия файла" ); } else { $num_str =  count ( $file_array );     echo( $num_str ); }?>

Заметим, что функцию file следует применять лишь для чтения небольших файлов.

Для чтения файлов с расширением *.csv применяется функция fgetcsv:

array fgetcsv (int file, int length, char delim )

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

Формат CSV является одним из форматов, в котором может сохранять файлы MSExcel. В следующем примере производится чтение созданного MSExcel файла file.csv, содержащего пароли пользователей.

<? $count = 1; $file =  fopen ( "file.csv","r" ); while ( $data = fgetcsv ( $file, 1000, "," ))   { $num = count ( $data ); $count++; for ( $i = 0; $i < $num; $i++ )     { print "$data[$i]<br>"; } } fclose ( $file );?>

Запись в файлы

Запись в файлы осуществляется функциями fputs и fwrite, которые абсолютно идентичны:

int fputs ( int file, string string [, int length ]) int fwrite ( int file, string string [, int length ])

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

В этом примере в файл "file.txt" записывается строка "Hello, world!"

<? $file = fopen ( "file.txt","r+" ); $str = "Hello, world!"; if (!$file ) { echo( "Ошибка открытия файла" ); } else { fputs ( $file, $str ); } fclose ( $file );?>

Копирование файлов осуществляется функцией copy:

int copy (string file1, string file2 )

Функция копирует файл с именем file1 в файл с именем file2. Если файл file2 на момент копирования существовал, то он перезаписывается.

Переименование файла производится с помощью функции rename:

int rename (string old, string new )

Эта функция переименовывает файл с именем old в файл с именем new.

Функция rename не выполняет переименования файла, если его новое имя расположено в другой файловой системе.

Удаление файла осуществляется посредством функции unlink:

int unlink (string filename )

Атрибуты файлов

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

Функция file_exists проверяет, существует ли файл и возвращает true, если файл существует и false в противном случае:

bool file_exists (string filename )

Функция fileatime возвращает время последнего обращения к файлу:

int fileatime (string filename )

Функция filemtime возвращает время последней модификации содержимого файла:

int filemtime (string filename )

Функция file_size возвращает размер файла в байтах:

int file_size (string filename )

Функция file_type возвращает тип файла:

string file_type (string filename )

Строка, возвращаемая этой функцией, содержит один из следующих типов файла:

· char (специальное символьное устройство);

· dir (каталог);

· fifo (именованный канал);

· link (символическая ссылка);

· block (специальное блочное устройство);

· file (обычный файл);

· unknown (тип не установлен).

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

<? clearstatcache ();?>

Перемещение по файлам

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

Установка указателя текущей позиции в начало файла производится функцией rewind:

int rewind (int file )

Аргумент file является дескриптором файла.

Узнать текущее положение указателя можно при помощи функции ftell:

int ftell (int file )

Установить указатель в любое место файла можно, используя функцию fseek:

int fseek (int file, int offset [, int whence ])

Функция fseek устанавливает указатель файла на байт со смещением offset (от начала файла, от его конца или от текущей позиции, в зависимости от значения параметра whence). Аргумент file представляет собой дескриптор файла. Аргументwhence задает с какого места отсчитывается смещение offset и может принимать одно из следующих значений:

· SEEK_SET (отсчитывает позицию начала файла);

· SEEK_CUR (отсчитывает позицию относительно текущего положения указателя);

· SEEK_END (отсчитывает позицию относительно конца файла).

По умолчанию аргумент whence имеет значение SEEK_SET.

Узнать, находится ли указатель в конце файла, можно с помощью функции feof:

int feof (int file )

Если указатель находится в конце файла, функция возвращает true, в ином случае возвращается false.

Функцию feof удобно использовать при чтении файла:

<? $file = fopen ( "file.txt","r" ); if ( $file ) { while(!feof ( $file )) { $str = fgets ( $file ); echo $str; echo ( "<br>" ); } fclose ( $file ); } else { echo( "Ошибка открытия файла" ); }?>

При помощи этой функции удобно также определять количество строк в файле:

<? $file = fopen ( "file.txt","r" ); if ( $file ) { $counter = 0; while(!feof( $file )) { $str = fgets ( $file ); $counter++; } echo( $counter ); fclose ($file ); } else { echo( "Ошибка открытия файла" ); }?>

 

Работа с каталогами

Для установки текущего каталога применяется функция chdir:

int chdir (string directory )

Работать с этой функцией можно следующим образом:

· chdir ( "/tmp/data" ); // переход по абсолютному пути

· chdir ( "./js" ); // переход в подкаталог текущего каталога

· chdir ( ".." ); // переход в родительский каталог

· chdir ( "~/data" ); // переходим в /home/пользователь/data (для Unix)

Чтобы узнать текущий каталог можно воспользоваться функцией getcwd:

string getcwd (string path )

Для того чтобы открыть каталог используется функция opendir, открывающая каталог, заданный параметром path:

int opendir (string path )

После того, как каталог открыт, прочитать его можно функцией readdir:

string readdir (int dir )

Эта функция возвращает имена элементов, содержащихся в каталоге. Кроме файлов и папок в каталогах находятся также элементы "." и "..". Первый элемент указывает на текущий каталог, а второй - на родительский. Текущий каталог, кстати, можно открыть, указав его имя как ".":

$dir = opendir ( "." );

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

void closedir ( $dir )

Ниже приведен пример, осуществляющий чтение и вывод файлов, находящихся в текущем каталоге.

<? $dir = opendir ( "." ); echo "Files:\n"; while ( $file = readdir ( $dir ))   { echo "$file<br>"; } closedir ( $dir );?>

Заметим, что эта функция возвращает также "." и "..". Если этого делать не нужно, то исключить эти значения можно следующим образом:

<? $dir = opendir ( "." ); while ( $file = readdir ( $dir )) { if (( $file != "." ) && ( $file != ".." )) { echo "$file<br>"; } } closedir ( $dir );?>

В качестве примера на рассмотренные функции, давайте создадим скрипт, удаляющий все файлы из каталога c:/temp, к которым не было доступа в течение суток. Функция удаления файлов в этом случае вызывается рекурсивно.

<? function delTemporaryFiles ( $directory ) { $dir = opendir ( $directory ); while (( $file = readdir ( $dir ))) { if( is_file ( $directory."/".$file )) { $acc_time = fileatime ( $directory."/".$file ); $time =  time(); if (($time - $acc_time ) > 24*60*60 ) {   if (  unlink ( $directory."/".$file ))   {     echo ( "Файлы успешно удалены" );   } } } else if ( is_dir ( $directory."/".$file ) && ( $file != "." ) && ( $file != ".." )) { delTemporaryFiles ( $directory."/".$file ); } } closedir ( $dir ); } delTemporaryFiles ( "c:/temp" );?>

Создание каталогов производится с помощью функции mkdir:

bool mkdir (string dirname, int mode )

Эта функция создает каталог с именем dirname и правами доступа mode. В случае неудачи возвращает false. Права доступа задаются только для каталогов UNIX, поскольку в Windows этот аргумент игнорируется. Ниже приведен пример создания каталога test в директории c:/temp.

<? $flag = mkdir ( "c:/temp/test", 0700 ); if( $flag ) { echo( "Каталог успешно создан" ); } else { echo( "Ошибка создания каталога" ); }?>

Удалить каталог можно с помощью функции rmdir:

bool rmdir (string dirname )

Теперь удалим только что созданный каталог /test:

<? $flag = rmdir ( "c:/temp/test" ); if( $flag ) { echo( "Каталог успешно удален" ); } else { echo( "Ошибка удаления каталога" ); }?>

Функция rmdir удаляет только пустые каталоги. Для того чтобы удалять непустые каталоги, давайте напишем функцию и удалим каталог c:/temp со всеми вложенными папками и файлами:

<? function full_del_dir ( $directory ) { $dir = opendir( $directory ); while(( $file = readdir( $dir ))) { if ( is_file ( $directory."/".$file )) { unlink ( $directory."/".$file ); } else if ( is_dir ( $directory."/".$file ) &&        ( $file != "." ) && ( $file != ".." )) { full_del_dir ( $directory."/".$file );     } } closedir ( $dir ); rmdir ( $directory ); echo( "Каталог успешно удален" ); } full_del_dir ( "c:/temp" )?>

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

Методы PUT и POST

Методы HTTP PUT и HTTP POST предназначены для загрузки файлов на сервер.

Протокол HTTP предоставляет три метода для работы с информацией, находящейся на Web-сервере: GET, PUT и POST. Метод GET применяется для получения Web-страниц, при этом все переменные формы передаются в URL. Поскольку на многих Web-серверах установлено ограничение на максимальную длину URL (как правило, не более 1024), не стоит применять метод GET, если требуется передача данных большего объема.

Метод PUT применяется для обновления информации на сервере, и требует, чтобы содержимое запроса HTTP PUT сохранялось на сервере. Запрос выглядит таким образом:

PUT /path/filename.html HTTP/1.1

В этом случае Web-сервер должен сохранить содержимое этого запроса в виде /path/filename.html в пространстве имен URL Web-сервера. По умолчанию сам Web-сервер не выполняет такие запросы, а задает CGI-сценарий для их обработки. В Apache назначить сценарий для обработки PUT-запросов, можно изменив директиву Script, находящуюся в файле httpd.conf, к примеру, так:

Script PUT /cgi-bin/put.cgi

Это означает, что обрабатывать PUT-запросы будет CGI-скрипт put.cgi.

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

Задания к лабораторной работе №6:

Задание 1.

1. Вычислить сумму факториалов до числа N (1!+2!+3!+...+N!).

2. Даны координаты вершин двух треугольников. Определить какой из них имеет большую площадь.

3. Даны три натуральных числа. Определить их наибольший общий делитель.

4. Даны три массива А, В, С. Найти

5. Даны три матрицы (4x4), Найти такую, где сумма элементов является максимальной.

6. Даны четыре квадратных уравнения. Найти то, в котором дискреминант наибольший.

7. Описать функцию sum(N)=sin(1) +sin(2) + sin(3) +...+ sin(N) и вычислить выражениея:

8. Даны две матрицы (5x5). Напечатать квадрат той из них, в которой наименьший след (сумма диагональных элементов).

9. Вычислить площадь правильного шестиугольника со стороной а, используя по функцию вычисляющую площадь треугольника.

10. Описать функцию, которая в массиве A[n] находит второе по величине число (т.е. меньше максимального, но больше всех других элементов).

 

Задание 2.

1. Компонентами файла f являются действительные числа. Найти: а) сумму компонент; б) произведение компонент; в) сумму квадратов компонент; г) модуль суммы и квадрат произведения компонент; д.) последнюю компоненту файла.

2. Компонентами файла f являются действительные числа. Найти: а) наибольшее из значений компонент; б) сумму наибольшего и наименьшего значений компонент; в) разность первой и последней компонент.

3. Компонентами файла g являются натуральные числа. Найти: а) количество четных чисел среди компонент; б) количество удвоенных нечетных среди компонент; в) количество квадратов нечетных чисел среди компонент.

4. Даны символьные файлы f1 и f2. Переписать с сохранением порядка следования компоненты файла f1 в файл f2, а компоненты файла f2 в файл f1. Использовать вспомогательный файл h.

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

6. Дан файл f, компоненты которого являются целыми числами. Записать в файл g все четные числа файла f, а в файл h - все нечетные. Порядок следования чисел сохраняется.

7. Дан символьный файл f. Записать в файл g все компоненты файла f в обратном порядке.

8. Дан файл f, компоненты которого являются целыми числами. Никакая из компонент файла не равна нулю. Числа в файле идут в следующем порядке: десять положительных, десять отрицательных, десять положительных, десять отрицательных и т.д. Переписать компоненты файла f в файл g так, чтобы в файле g числа шли в следующем порядке: пять положительных, пять отрицательных, пять положительных, пять отрицательных и т.д. (предполагается, что число компонент файла f делится на 20); двадцать положительных, двадцать отрицательных, двадцать положительных, двадцать отрицательных и т.д. (предполагается, что число компонент файла f делится на 40).

9. Даны символьные числа f и g. Определить, совпадают ли компоненты файла f с компонентами файла g. Если нет, то получить номер первой компоненты, в кторой файлы f и g отличаются между собой. В случае когда один из файлов имеет n компонентов (n>=0) и является началом другого (более длинного) файла, ответом должно быть число n+1.

10. Дан символьный файл f. Переписать компоненты файла в файл g, заменив при этом: а) каждый восклицательный знак точкой; б) каждую точку многоточием (т.е. тремя точками); в) каждую из групп стоящих рядом точек одной точкой.



Поделиться:


Последнее изменение этой страницы: 2020-11-28; просмотров: 296; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.30.162 (0.043 с.)