Средства обработки файлов.
Чтобы создавать и обрабатывать файлы в программе, необходимо:
1.описать переменную, соответствующую файлу;
2.задать соответствие между файлом и переменной.
Описание файловой переменной зависит от типа файла:
-текстовые:
Var <файловая переменная>:text;
-типизированные:
Var
<файл. пер-я>:file of <тип элементов файла>
-нетипизированные
Var <файловая переменная>:file;
Для установления соответствия между переменной и реально существующим файлом на диске в языке используется процедура
assign (<файловая переменная >,<имя файла>);
Зам! Имя файла может быть строковой постоянной, тогда оно записывается в апострофах, или строковой переменной, тогда достаточно указать имя этой переменной. Если файл располагается не в текущей директории, то необходимо
указать полный путь до него.
Процедура Assign всегда предшествует другим процедурам работы с файлами, так как ставит в соответствие конкретному файлу на внешнем устройстве логическую файловую переменную языка, к которой впоследствии будут обращаться другие файловые процедуры. Недопустимо использование процедуры Assign уже открытого файла.
Для работы с файлом, прежде всего, необходимо его открыть. В языке Паскаль предусмотрены для этого две процедуры:
Reset (<файловая переменная >); — открывает существующий файл;
Rewrite (<файловая переменная >); — создает и открывает новый файл.
Открытие внешнего файла с помощью процедуры Reset в случае отсутствия на диске может привести к ошибке при выполнении программы.
При попытке создать и открыть новый файл с именем уже существующего на диске набора данных, действие процедуры сведется к удалению существующего набора, создания и открытия нового.
Операция закрытия файла является логическим окончанием работы с любым открытым файлом. Для этого служит процедура Close (var F);
Использование процедуры Close позволяет устранить связь файловой переменной с внешним файлом, установленную с помощью процедуры Assign.
Пример: Полная цепочка команд для создания простого текстового файла с именем WORK.TXT:
Program _;
Var F: text;
begin
Assign(F, 'WORK.TXT');
Rewrite(F);
Write(F,'Простой текстовый файл'); Close(F);
end.
К языковым средствам обслуживания файлов необходимо отнести процедуры переименования и удаления неоткрытых файлов. Использование этих процедур не зависит от типа файла.
Rename(<файловая переменная>,<нов.имя>);-процедура переименовывает неоткрытый файл любого типа
Erase(<файловая переменная >);- процедура удаляет неоткрытый внешний файл любого типа
Обе процедуры нельзя использовать для уже открытых файлов. В противном случае могут возникнуть нежелательные последствия со стороны операционной системы.
Единственным стандартным шагом перед использованием процедур является установка связи между внешним файлом с конкретным именем и файловой переменной. Операции удаления и переименования осуществляются только для реально существующих файлов, иначе возникает ошибка выполнения программы.
Пример: Удаление или переименование файла.
Program _;
Var F: file ;
Ch: char;
St: string;
begin
Write('Введите имя файла: ');
Readln(St);
Assign(F, St);
Write('Удалить файл(У), Переименовать(П),');
Readln(Ch);
case Ch of
'у': Erase(F);
'п': begin
Write(‘Введите новое имя файла: ');
Readln(St);
Rename(F, St);
end;
end.
Для чтения и записи данных используют следующие процедуры:
READ(<файл.пер >,<переменная>)-процедура чтения из файла в переменную.
WRITE (<файл.пер >,<переменная>)- процедура записи из переменной в файл.
Часто при работе с файлами используется функция:
EOF (<файловая переменная> ) - возвращает булевское значение True, если указатель чтения- записи в конце файла, и False — в противном случае.
Для того чтобы файловые операции выполнялись четко и без ошибок, необходимо использовать специальную функцию IOresult. Функция работает без параметров и возвращает значение типа integer, представляющее статус последней выполненной операции ввода-вывода: после корректного выполнения операции ввода-вывода функция IOresult возвращает значение, равное нулю, в остальных случаях функция возвращает соответствующий код ошибки.
Использование этой функции в программах возможно лишь в том случае, если на время выполнения файловых операций отключена стандартная проверка операций ввода-вывода. Для этих целей используется директива компилятору {$I}, которая может задаваться внутри текста программы.
Пример: Вариант программы для проверки существования файла на диске
Program _;
Var F: file ;
St: string;
begin
Write('Введите имя файла : ');
Readln(St);
Assign(F, St);
{$I—} {Отключить стандартную обработку ошибок}
Reset(F); {Открыть файл}
{$I+} {Включить стандартную обработку ошибок}
if IOresult = 0 then
begin
Writeln('Файл существует и нормально открыт’);
Close(F);{Закрыть файл}
end;
else
Writeln('Файла с именем’,St,' на диске нет');
end.
Дома: Разобрать и выучить все функции обработки файлов.
Лекция 37.
Текстовые файлы
Текстовый файл можно рассматривать как последовательность символов, разбитую на строки длиной от 0 до 255 символов. Для описания используется стандартный тип Text:
Var < файловая переменная>: text;
Каждая строка завершается маркером конца строки. На практике такой маркер представляет собой последовательность из двух символов: перевод строки chr(13) и возврат каретки chr(10). Эти два символа задают стандартные действия по управлению текстовыми файлами. Стандартно открываемые предопределенные файлы Input и Output в модуле System имеют тип Text
У текстовых файлов своя специфика. Специальные расширения стандартных процедур чтения Read и записи Write разрешают работать со значениями несимвольного типа. Другими словами, последовательность символов автоматически преобразуется к значению того типа переменной, которая используется в файловых операциях.
Вызов Read(F, W), где W — переменная типа word, осуществляет чтение из файла F последовательности цифр, которая затем интерпретируется в число, значение которого и будет присвоено переменной W. В случае если вместо последовательности цифр идет любая другая последовательность символов, использование такого оператора приводит к ошибке выполнения программы.
Открытие текстового файла можно произвести двумя стандартными способами:
1. поставить в соответствие файловой переменной имя файла (процедура Assign), открыть новый текстовый файл (процедура Rewrite);
2. поставить в соответствие файловой переменной имя файла (процедура Assign), открыть уже существующий файл (процедура Reset).
Текстовый файл в силу своей специфики во время работы допускает какой-либо один вид операции: чтение или запись. В связи с этим для работы с текстовыми файлами появляется еще одна процедура открытия файла:
Append(<файловая переменная>);
Эта процедура открывает уже существующий файл и позиционирует указатель обработки на конец файла. После такого открытия текстовый файл можно только дополнять информацией, начиная с конца строки. Ограничения, накладываемые на процедуру Append, такие же, как у процедур Reset и Rewrite.
Для обработки текстовых файлов используются процедуры Read и Write, обеспечивающие соответственно чтение и запись одной строки и более в текстовый файл. Использование специальных разделителей строк файла позволило ввести в состав языковых средств процедуры Readln. Процедура Read обеспечивает ввод данных общим потоком из одной строки, a Readln приводит к обязательному переходу к следующей строке текстового файла, т.е. ввод данных осуществляется из различных строк. Writeln, обеспечивающую запись всех величин с обязательной установкой маркера конца строки в файл. Общий вид представления процедур следующий:
Readln(var F : text; VI [,V2,.. .Vn]) ;
Writeln(var F : text; VI [,V2,. . .Vn]) ;
где VI...Vn переменные разных типов.
При организации операций ввода-вывода используются специальные языковые средства в виде функций Eoln, Eof
Функция Eof(var F: text) возвращает булевское значение True, если указатель конца файла находится сразу за последним компонентом, и False — в противном случае.
Функция Eoln(var F: text) возвращает булевское значение True, если текущая файловая позиция находится на маркере конца строки или вызов Eof(F) возвратил значение True. Во всех других случаях значение функции будет False.
Задачи:
1. Дан файл «Primer.txt» вывести на экран его содержимое.
program _;
uses crt;
var f: text;
a:string;
i,k: byte;
begin
clrscr;
assign(f,'primer.txt');
reset(f);
while not eof(f) do
begin
Readln(f,a);
writeln(a) ;
end;
close(f);
end.
2. Дан файл «Work.txt» при выводе файла на экран заменить все цифры на «*».
program _;
uses crt;
var f: text;
a:string;
i,k: byte;
begin
clrscr;
assign(f,'work.txt');
reset(f);
while eof(f) do
begin
Readln(f,a);
For i:= 1 to length(a) do
If (a[i]>=’0’) and (a[i]<=’9’) then a[i]:=’*’;
writeln(a) ;
end;
close(f);
end.
3. Создать свой текстовый файл, поместить в него заглавные русские буквы.
program _;
uses crt;
var f: text;
a, nane:string;
i,k: byte;
begin
Writeln(‘введите имя создаваемого файла’);
Readln(name);
assign(f,name);
rewrite(f);
for i:=128 to 159 do
begin
write(f,chr(i):3) ;
k:=k+1;
if k=16 then
begin
writeln(f);
k:=0;
end;
end;
close(f);
end.
4. Дан файл, заполненный заглавными русскими буквами, дописать в него маленькие русские буквы.
program _;
uses crt;
var f: text;
a,name:string;
i,k: byte;
begin
clrscr;
Writeln(‘введите имя файла, в который будем дописывать ’);
Readln(name);
assign(f,name);
append(f);
for i:=160 to 175 do
begin
write(f,chr(i):3) ;
k:=k+1;
if k=16 then
begin
writeln(f);
k:=0;
end;
end;
for i:=224 to 239 do
begin
write(f,chr(i):3) ;
k:=k+1;
if k=16 then
begin
writeln(f);
k:=0;
end;
end;
close(f);
end.
5. Написать программу, обеспечивающую создание на диске текстового файла и запись в него.
Program _;
uses crt;
var f:text;
new, name: string;
s: char;
i:integer;
begin
clrscr;
Writeln(‘введите имя создаваемого файла’);
Readln(name);
assign(f,name);
rewrite(f);
writeln('введи текст, для завершения нажми enter');
repeat
readln(new);
write(f,new);
until new=’’;
close(f);
end.
6. Скопировать содержимое одного файла в другой.
program _;
uses crt;
var f1,f2: text;
a:string;
i,k: byte;
begin
clrscr;
assign(f1,'work.txt');
assign(f2,'we.txt');
reset(f1);
rewrite(f2);
while not eof(f1) do
begin
readln(f1,a) ;
writeln(f2,a) ;
end;
close(f1);
close(f2);
end.
Использование буфера ввода-вывода. Рассмотрим процедуру обмена информацией между программой и внешним текстовым файлом на диске. Для передачи данных используется буфер ввода-вывода в виде участка оперативной памяти, через который осуществляются все операции обмена. Для языка Паскаль стандартный буфер ввода-вывода имеет объем 128 байт. Каждому открытому файлу вместе с обработчиком назначается и свой буфер. Возникает задача оптимизации обращения к внешним носителям информации.
Например, процедура Writeln записывает все данные последовательно в буфер, физическая запись на внешнее устройство происходит только тогда, когда информацией будет занят последний байт буфера. После записи на диск буфер освобождается для приема следующей порции информации. Таким образом, достигается компромисс между количеством и длительностью обращений к диску. Если бы каждый вызов процедуры Writeln приводил на практике к физическому обращению к диску, то тратилось бы непозволительно много времени на позиционирование головки чтения-записи для доступа к файлу.
Специально введенная процедура Flush(<файловая переменная>) дает возможность связать запись с помощью процедур Write и Writeln непосредственно с физической записью на диск. Вызов процедуры гарантирует, что все символы, переданные для записи, действительно в это же время будут записаны во внешний файл. Использовать процедуру можно для текстовых файлов, открытых только для записи процедурами Rewrite и Append. В прикладных программах процедуру используют редко, как правило, в тех случаях, когда необходимо подтверждение о физической записи во внешний файл
Процедура SetTextBuf (<файл. переменной>;Buf[; size])- дает возможность назначить свой буфер ввода-вывода (Buf) необходимого объема (Size) текстовому файлу. Параметр Size при вызове может быть опущен. В этом случае размер буфера соответсвует SizeOf(Buf). Назначение SetTextBuf файловой переменной распространяется до следующего использования переменной новым внешним файлом.
Пример: Назначение буфера ввода-вывода.
var F: text;
Ch: char;
Buf: array[1..2048] of char; {Буфер 2 Кбайта}
begin
Assign(F,’primer.txt’);
SetTextBuf(F, Buf);{Установить файлу буфер 2 Кбайта}
Reset(f);
while not Eof(F) do
begin {Вывести файл на экран}
Read(F, Ch); ц
Write(Ch);
end;
end.
Потери информации при обмене будут исключены, если переназначение буфера ввода-вывода будет осуществлено после вызова процедуры Assign либо сразу после процедур открытия файлов до любой операции обмена.
Лекция 38.
Дата добавления: 2016-05-25; просмотров: 1048;