Perl. Работа с текстовыми файлами.




Для открытия файла использ функция open (): open(переменная,"[способ открытия]путь к файлу");

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

Способов открытия для файла несколько. Наиболее важными являются:

open(myfile,"[<]myfile"); # Открыть файл для чтенияopen(myfile,">myfile”); # Открыть файл для записиopen(myfile,">>myfile”); # открыть файл для дозаписиopen(myfile,"+>myfile”); open(myfile,"+<myfile”); open(myfile,"+>>myfile”); #Открыть файл для чтения и записи

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

Различия между тремя режимами чтения/записи +<, +> и +>>: первый и третий режимы сохраняют содержимое открываемого файла, тогда как открытие файла с использованием второго режима (+>) сначала очищает содержимое открываемого файла. Третий режим отличается от первых двух тем, что запись в файл всегда осуществляется в конец содержимого файла.

При открытии файла функции open возвращают не нулевое значение, если открытие файла с заданным режимом произошло успешно, и неопределенное значение undef в противном случае. Всегда следует проверять успешность выполнения операции открытия файла, прекращая выполнение программы функцией die (). Эта функция отображает список передаваемых ей параметров и завершает выполнение сценария Perl: open(FF, "+< $file") or die "Нельзя открыть файл!";

В программах следует избегать работы с одним файлом через несколько дескрипторов-копий.

По завершении работы с файлом он закрывается функцией close (). Единственным необязательным параметром этой функции является дескриптор, ассоциированный с файлом: close ДЕСКРИПТОР;

Эта функция возвращает значение Истина, если успешно очищен буфер ввода/вывода и закрыт системный дескриптор файла. Вызванная без параметра, функция close закрывает файл, связанный с текущим дескриптором, установленным функцией select().

Закрывать файлы в программе функцией close() не обязательно. Открытие нового файла с дескриптором, уже связанным с каким-либо файлом, закрывает этот старый файл. Более того, при завершении программы все открытые в ней файлы закрываются. Но такое неявное закрытие файлов таит в себе потенциальные ошибки из-за невозможности определить, завершилась ли эта операция корректно. Может оказаться, что при записи в файл переполнится диск, или будет разорвана связь с удаленным устройством вывода. Подобные ошибки можно "отловить", если использовать явное закрытие файла и проверять содержимое специальной переменной $! (сообщение ОС об ошибке): Close(FILEIO) or die "Ошибка закрытия файла: $!";

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

Чтение информации из файла осуществляется операцией <>, операндом которой является дескриптор файла. В скалярном контексте при первом выполнении эта операция читает первую запись файла, устанавливая специальную переменную $. равной 1. Последующие обращения к операции чтения из файла с тем же дескриптором приводят к последовательному чтению следующих записей. В списковом контексте эта операция читает все оставшиеся записи файла и возвращает список, элементами которого являются записи файла. Разделитель записей хранится в специальной переменной $/, и по умолчанию им является символ новой строки "\n". Perl позволяет задать и другой разделитель записей обычной операцией присваивания переменной $/ нового символа разделителя записей.

#! perl -w

open(F1, "in.dat") or die "Ошибка открытия файла: $!";

open(F2, "<out.dat") or die "Ошибка открытия файла: $!";

$line1 = <F1>; # Первая запись файла in.dat

$line2 = <F1>; # Вторая запись файла in.dat

@rest = <F1>; # Оставшиеся записифайла in.dat

$/=":"; # Задание другого разделителя записей файла

@f2 = <F2>;

for($i=0; $i<=$#f2; $i++) { print "$f2[$i]\n"; # Печать прочитанных записей файла out.dat

} $/ = "\n"; # Восстановление умалчиваемого разделителя записей

close(F1) or die $!; close(F2) or die $!;


При достижении конца файла операция <> возвращает неопределенное значение, которое трактуется как Ложь. Это обстоятельство обычно используется для организации чтения записей файла в цикле:

while($line = <F1>) {print $line; # Печать очередной строки связанного с дескриптором F1 файла }

Запись в файл, открытый в режиме записи или добавления, осуществляется функцией print () с первым параметром, являющимся дескриптором файла: print ДЕСКРИПТОР СПИСОК_ВЫВОДА;

open(myfile,">myfile.txt"); print myfile "Текст в файле!"; close(myfile);

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

$/=":"; # Разделитель записей

print F1 @rec1, $/; # Запись в файл первой записи

print F1 @rec2, $/; # Запись в файл второй записи

Файлы в Perl интерпретируются как неструктурированные потоки байтов. При работе с файлом через дескриптор отслеживается его текущая позиция. Операции чтения/записи выполняются с текущей позиции файла. Для определения текущей позиции в файле используется функция tell (), единственным параметром которой может быть дескриптор файла. Она возвращает текущую позицию в связанном с дескриптором файле. Эта же функция без параметра возвращает текущую позицию в файле, для которого была в программе выполнена последняя операция чтения.

Текущая позиция в файле автоматически изменяется в соответствии с выполненными операциями чтения/записи. Ее можно изменить с помощью функции seek (). Для связанного с дескриптором файла устанавливается новая текущая позиция, смещенная на заданное параметром СМЕЩЕНИЕ число байт относительно точки отсчета: seek ДЕСКРИПТОР, СМЕЩЕНИЕ, ТОЧКА_ОТСЧЁТА;

Параметр ТОЧКА_ОТСЧЁТА может принимать одно из трех значений: 0 — начало файла, 1 — текущая позиция, 2 — конец файла. Смещение может быть как положительным, так и отрицательным. Обычно оно отрицательно для смещения относительно конца файла и положительно для смещения относительно начала файла. Для задания точки отсчета можно воспользоваться константами SEEK_SET, SEEK_CUR и SEEK_END из модуля Seekable, которые соответствуют началу файла, текущей позиции и концу файла. Естественно, необходимо подключить этот модуль к программе с помощью ключевого слова use.

seek FILE1, 5, 0; seek FILE2, 5, SEEK_SET;

Для перехода в начало или в конец файла следует использовать нулевое смещение относительно соответствующих точек отсчета при обращении к функции seek ():

seek FILE1, 0, 0; # Переход в начало файла seek FILE1, 0, 2; # Переход в конец файла

Кроме операции чтения записей файла <>, существуют еще два способа чтения из файла: функции getc () и read (). Первая читает один байт из файла, вторая читает записи фиксированной длины.

Функция getc возвращает символ в текущей позиции файла, дескриптор которого передан ей в качестве параметра, или неопределенное значение в случае достижения конца файла или возникновении ошибки. Если функция вызывается без параметра, то она читает символ из стандартного файла ввода STDIN.

getc; # Чтение символа из STDIN getc F1; # Чтение символа в текущей позиции файла F1

Функция read (): read ДЕСКРИПТОР, ПЕРЕМЕННАЯ, ДЛИНА [,СМЕЩЕНИЕ];

Она читает количество байтов, определенное значением параметра ДЛИНА, в скалярную переменную, определяемую параметром ПЕРЕМЕННАЯ, из файла с дескриптором, заданным первым параметром ДЕСКРИПТОР. Возвращаемое значение — действительное количество прочитанных байтов, 0 при попытке чтения в позиции конца файла и неопределенное значение в случае возникновения ошибки. Параметр СМЕЩЕНИЕ определяет количество сохраняемых байтов из содержимого переменной ПЕРЕМЕННАЯ, т. е. запись прочитанных из файла данных будет добавлена к содержимому переменной после байта, определяемого значением параметра СМЕЩЕНИЕ. Отрицательное значение смещения -N означает, что из содержимого переменной ПЕРЕМЕННАЯ отбрасываются последние N байтов и к оставшейся строке добавляется запись, прочитанная из файла.

#! peri -w #Файл in.dat содержит три строки данных: One Two Three

open(F1, "in.dat") or die "Ошибка открытия файла: $!";

$string = "1234567890";

read F1, $string, 6; #Чтение шести байт в переменную без смещения

print $string,"\n"; # $string = "One\nTw"

read F1, $string, 6, length($string);

print $string,"\n"; # $string = "One\nTwo\nThre"

Функция length() возвращает количество символов (байтов) в строковых данных, хранящихся в скалярной переменной, переданной ей в качестве параметра. После выполнения первой операции чтения содержимое переменной $string было уничтожено, так как эта функция read() вызывалась без смещения. При втором чтении хранившиеся данные в переменной $string были сохранены.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: