5. Файлы произвольного доступа

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

Организовать файл произвольного доступа можно двумя способами:

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

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

Пример. Форматировать файл произвольного доступа из 20 компонент c:\turbo\bibl.dos. Структура компонент такая же, как и в Prim 47-49. Оформим алгоритм в виде процедуры form, запишем ее в c:\turbo\form.pas.

Procedure form;

Begin writeln ('дайте имя форматизируемому файлу');

readln(filname);

assign(booksfile, filname);

rewrite(booksfile);

with recbooks do

Begin writeln ('на сколько записей форматировать файл?');

readln(razmer);

for i:=l to razmer do

Begin nomer:=i; avtor:=' '; index:=0; nazv:=' ';

write ( books file, recbooks)

end; end; writeln(фopматизация ',razmer,' запись выполнена');

close(booksflle); end;

Напишем процедуру загрузки (procedure zagruz), которая будет заменять поля фиктивных записей реальными значениями, и запишем ее в c:\turbo\zagruz.pas;

procedure zagruz; Begin writeln('дать имя загружаемого по ключу файла');

readln(filname);

assign(booksfile,filname); reset(booksfile);

writeln('сколько записей будете вводить?'); readln(k);

with recbooks do

Begin for i:=1 to k do

Begin writeln('введите номер'); readln(nomer);

writeln('введите имя автора'); readln(avtor);

writeln('введите название книги'); readln(nazv);

writeln('введите индекс'); readln(index);

seek(booksfile,nomer-1); { номера компонент начинаются с 0 }

write(booksfile,recbooks); end; end;

close(booksfile); end;

Оформить процедуру прямого доступа по ключу к компонентам файла и выдачу их на экран монитора, записать ее в C:\TURBO\OBRAB.PAS;

Procedure Obrab;

Begin writeln('дайте имя файла'); readln(filname);

assign(booksfile,filname); reset(booksfile);

while true do

Begin writeln('укажите ключ обрабатываемой записи'); readln(k);

if k=9999 then Begin close(booksfile); exit; end;

seek(booksfile,k-1);

with recbooks do Begin read(booksfile,recbooks);

writeln(nomer:5,avtor:16,nazv:15,index:4);

end; end; end;

Написать процедуру корректировки файла произвольного доступа в которой будут предусмотрены режимы корректировки:

Замена всех полей компоненты.

Расширение файла в пределах отформатированного пространства.

все это делает процедура Кооr, записанная в c:\turbo\koor.pas.

Procedure Koor;

Var nevavtor:string[16]; nevnazv:string[30]; nevindex:integer;

Begin writeln('дайте имя файла'); readln(filname);

assign(booksfile,filname); reset(booksfile);

with recbooks do

Begin writeln('сколько записей будете корректировать?'); readln(k);

for i:=1 to k do

Begin writeln('дайте номер корректируемой записи'); readln(k1);

nevavtor:=' '; nevnazv:=' '; nevindex:=0;

writeln('введите имя автора'); readln(nevavtor);

writeln('введите название книги'); readln(nevnazv);

writeln('введите индекс'); readln(nevindex);

avtor:=nevavtor; nazv:=nevnazv; index:=nevindex;

seek(booksfile,k1-1); write(booksfile,recbooks);

end; end; close(booksfile); end;

В программе Prim 50, с помощью меню рассматриваются работа с файлами произвольного доступа во всех режимах; форматирование файла, его загрузка, обработка, корректировка. Здесь следует заметить, что программа универсальна в том смысле, что может работать с различными файлами.

Program Prim50;

Type books=record

nomer:integer; avtor:string[16];

nazv:string[30]; index:integer; end;

Var booksfile:file of books;

recbooks:books; razmer,k,k1,i,reg:integer;

filname:string[12];

{$i c:\turbo\form.pas}

{$i c:\turbo\zagruz.pas}

{$i c:\turbo\obrab.pas}

{$i c:\turbo\koor.pas}

Begin while true do

Begin writeln('укажите режим');

writeln('1: форматизация');

writeln('2: загрузка по ключу');

writeln('3: обработка по ключу');

writeln('4: корректировка');

writeln('5: выход из программы');

readln(reg);

case reg of 1:form; 2:zagruz; 3:obrab; 4:koor; 5:halt;

end;

end;

end.