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. |