Средства обработки файлов.

 

Чтобы создавать и обрабатывать файлы в программе, необходимо:
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; просмотров: 1039;


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

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.052 сек.