Файлы произвольного доступа создаются для решения задач, требующих оперативного доступа к хранимой информации или при наличии зависимости значения поля компонента от порядкового номера компонента в файле. Последовательный доступ в этих случаях неэффективен.
Работа с файлом произвольного доступа предполагает:
Ø создание файла;
Ø обработку файла;
Ø корректировку файла.
Организовать файл произвольного доступа можно двумя способами:
1. создать последовательный файл и обращаться к компонентам по их порядковому номеру, трактуя последовательный файл как произвольный;
2. создать файл фиктивных записей, затем загрузить его по ключу фактическими данными; обращение к компонентам по ключу предполагает использование процедуры Seek.
Для огранизации произвольного доступа используется процедура Seek. Произвольный доступ организовывается по ключу, значение которого равно порядковому номеру в файле нужного компонента. Ключ должен иметь целочисленное значение, не превышающее количество компонентов в файле.
Первый способ аналогичен созданию последовательного файла, поэтому рассмотрим второй способ.
Форматизация заключается во внесении в файл компонентов, значение полей которых носит фиктивный характер, например, нули или пробелы.
Форматизовать файл произвольного доступа из 20 записей на дисководе d:. Формат компонентов такой же, как в предыдущем примере. Оформить блок как процедуру с именем Form и сохранить на диске под именем d: NForm.
Program DemoDF;
Const
Razmer = 20;
Type
Books = record
Nomer : integer;
Avtor : string[14];
Nazv : string[30];
Index : integer;
End;
Var
BF : file of Books;
RB : Books;
K, K1 : integer;
I, Rej : integer;
FilName : string [12];
Procedure Form;
begin
writeln ('Дайте имя форматизуемого файла:');
readln (FilName);
Assign( BF,FilNam);
Rewrite(BF);
with RB do
begin
for I := 1 to Razmer do
begin
Nomer : = 0; {если нужно при форматизации сразу внести в запись значение номера 1, можно этот оператор записать: Nomer : =1;}
После форматизации файла можно приступить к его загрузке по ключу компонентами с фактической информацией, которые будут по мере записи в файл заменять фиктивную информацию.
Пример.
Внести в файл BIBL2. DOC фактические записи с номерами 3, 7, 8. Оформить блок загрузки процедурой с именем Zagrkl. Текст процедуры сохранить на диске под именем d: NZagrkl.
Procedure Zagrkl;
begin
writeIn ('Дайте имя загружаемого по ключу файла');
readln (FilName);
Assign( BF, Fi1Name);
Reset( BF);
writeln ('Сколько записей будете вводить?');
readln (К);
with RB do
for I := 1 to К do
begin
writeln ('Введите номер');
readIn (Nomer);
K1 := Nomer;
writeln ('Введите имя автора');
read (Avtor);
writeln ('Введите название книги');
readln (Nazv);
writeln ('Введите индекс');
readln (Index);
Seek( BF, K1-1);
write ( BF,RB)
end;
Close( BF)
end;
Когда в файл загружена фактическая информация, можно приступать к использованию этой информации.
Доступ к компонентам файла произвольного доступа может быть как последовательный, так и произвольный. Последовательный доступ не отличается от описанного выше. Для огранизации произвольного доступа используется процедура Seek. Произвольный доступ организовывается по ключу, значение которого равно порядковому номеру в файле нужного компонента. Ключ должен иметь целочисленное значение, не превышающее количество компонентов в файле.
Приведем порядок действий при обработке файлов произвольного доступа:
Ø присвоить файлу имя (процедура Assign);
Ø открыть файл (процедура Reset) и запросить ключ;
Ø подвести указатель по ключу к нужному компоненту (процедура Seek);
Ø считать нужный компонент (оператор read);
Ø выполнить обработку считанной информации;
Ø закрыть файл (процедура Close).
Пример:
Вывести на экран 6 и 7 компоненты файла BIBL2. DOC. Блок вывода оформить процедурой с именем Obrkl. Текст процедуры сохранить на диске под именем NObrkl.