Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.docx
Скачиваний:
192
Добавлен:
28.03.2015
Размер:
383.85 Кб
Скачать

24. Типизированные файлы. Создание и просмотр файлов.

Более характерным для Pascal являются типизированные файлы, или файлы произвольного доступа (последовательный+прямой). Основным свойством этих файлов является то, что их структура данных представляет собой последовательностькомпонентов одного типа. Описывают подобный файл словосочетаниемfile ofс последующим указанием типа компонентов файла, число которых (длина файла) не фиксируется:

varимя_файла:fileofтип_компонентов

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

Чтобы можно было работать с типизированным файлом, необходимо, как и для текстовых файлов, сначала связать имя файловой переменной с внешним именем файла(операторAssign). Затем нужно открыть его (используются операторыResetиRewrite, но неAppend). ОператорыResetиRewriteоткрывают файли для чтения, и для записи(а не только для чтения или только для записи, как при использовании текстовых файлов). Отличие их в том, что операторResetоткрывает толькосуществующийфайл (если такого файла нет, будет сгенерирована ошибка времени выполнения). С другой стороны, операторRewriteсоздает новый файл (еслифайл с таким именем ужеимеется, то онбудет уничтожени создан заново). При открытии файла с ним связывается текущий указатель файла, который позиционируется на его первый элемент. Оперировать можно только тем элементом файла,на который ссылается указательфайла. При чтении или записи элемента файла происходит автоматическое перемещение указателя на следующий элемент. Чтение из типизированного файла производится операторомRead(но неReadLn), а запись в него — операторомWrite(но неWriteLn). Однако следует помнить, что в списке вывода оператора Write могут быть только переменные. Типы элементов файла и типы переменных в списках ввода-вывода должны быть согласуемы по присваиванию. Элементами типизированных файлов могут быть числовые, символьные, булевы, строковые значения, массивы, записи, но не файлы или структуры с файловыми элементами.

Узнать количество элементов типизированного файла (размер файла) можно с помощью функции FileSize, для которой используется следующий синтаксис:

FileSize(имя_файла)

Элементы типизированного файла нумеруются с нуля(порядковый номер последнего элемента файла на единицу меньше размера файла). Чтобы узнать, на каком элементе располагается указатель файла, используют функциюFilePos:

FilePos(имя_файла)

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

Seek(имя_файла,номер_элемента)

Второй параметр (тип LongInt) задает номер элемента (отсчет от 0), на который должен переместиться указатель файла.

Как и для текстовых файлов, можно использовать функцию Eof(имя_файла), которая возвращает значениеTrue, если текущий указатель расположен на признаке конца файла (т. е. при выполнения равенстваFilePos(имя_файла) = FileSize(имя_файла)).

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

Текстовые файлы могут быть созданы текстовым редактором. Однако типизированные файлы создаются в результате работы какой-либо программы.

Пример записи данных в типизированный файл:

type

t_subscriber = record

surname: string[20];

tel: LongInt;

end;

 

var

subscriber: t_subscriber;

f: file of t_subscriber;

i: Integer;

 

begin

Assign(f,'notebook.dat');

Rewrite(f);

for i:=1 to 5 do begin

with subscriber do begin

Write('Surname: ');

ReadLn(surname);

Write('Phone: ');

ReadLn(tel);

end;

Write(f, subscriber);

end;

Close(f);

end.

Пример последовательного доступа к типизированному файлу:

type

t_subscriber = record

surname: string[20];

tel: LongInt;

end;

 

var

subscriber: t_subscriber;

f: file of t_subscriber;

s: string[7];

 

begin

Assign(f,'notebook.dat');

Reset(f);

while not Eof(f) do begin

Read(f, subscriber);

with subscriber do begin

str(tel,s);

if Copy(s,1,2) = '33' then

tel := tel+4000000;

end;

Seek(f,FilePos(f)-1); // возврат указателя назад

Write(f,subscriber);

end;

Close(f);

end.

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

type veshi=record

surname:string[20];

n:integer;

p:real;

end;

file_rec=file of veshi;

Просмотр файла

Procedure Print (var f:file_rec); {Процедура вывода информации из файла на экран}

const str=' ';

var v:veshi;

z,i:integer;

begin

clrscr; writeln;

if filesize (f)=0 then {Проверяем пуст ли файл}

writeln ('File is empty')

else

begin

seek(f,0);

while not eof(f) do

begin

read(f, v);

write (v.surname);

z:=length(v.surname);

z:=z+1;

for i:=z to 20 do

write (' ');

write (v.n,str);

writeln(v.p:7:2);

end;

end;

writeln; writeln ('Press "Enter"');

readln;

end;