Двоичные файлы прямого доступа
Средства для работы с двоичными файлами прямого доступа находятся в родовом пакете Ada. Direct_IO. Элементы этих файлов также должны принадлежать к типу Element_Type, который является формальным родовым параметром пакета.
Для работы с файлами прямого доступа разрешены три режима: In_File (ввод из файла), InOut_File (ввод из файла и вывод в файл), Out_File (вывод в файл).
Основное отличие файлов прямого доступа — обработка их элементов производится в произвольном порядке. На практике для работы с элементом такого файла надо указывать его индекс.
Индекс отображает положение элемента в файле. Непосредственно после открытия файла значение индекса устанавливается равным 1. Для обработки индекса в пакете Ada.Direct_IO имеются:? процедура установки индекса Set_Index;
? функция определения индекса Index;
? функция определения максимального индекса Size.
Процедура
procedure Set_Index ( File : File_Type; To : Positive_Count );
устанавливает индекс, равный значению параметра To.
ПРИМЕЧАНИЕ ---------------------------------------------------------------------------------------------------
Диапазон значений подтипа Positive_Count — от 1 до зависящего от реализации числа Count’Last.
Функция function Index ( File : File_Type ) return Positive_Count; возвращает значение, равное текущему индексу файла. Имеются две модификации процедуры чтения элемента из файла прямого доступа и занесения его в переменную Item: procedure Read ( File : in File_Type; Item : out Element_Type; From : in Positive_Count ); procedure Read ( File : in File_Type; Item : out Element_Type); |
Двоичные файлы прямого доступа |
555 |
Для первой модификации из файла читается элемент, индекс которого указы- вается параметром From. Для второй модификации индекс считываемого элемента равен текущему значению индекса файла. После выполнения операции ввода значение индекса увеличивается на единицу. Аналогичным образом предусмотрены две разновидности процедуры записи из переменной Item в элемент файла: procedure Write ( File : in File_Type; Item : in Element_Type; To : in Positive_Count ); procedure Write ( File : in File_Type; Item : in Element_Type ); Параметр To задает индекс элемента, в который записываются данные. Если параметр To не указан, то используется текущее значение индекса файла. После завершения вывода значение индекса увеличивается на 1. Максимально возможное значение индекса файла возвращается с помощью функции function Size ( File : File_Type ) return Count; В качестве примера рассмотрим программу, в которой: 1) создан экземпляр пакета Ada.Direct_IO — для работы с типом Book; 2) объявлена процедура Format — для создания дискового файла прямого доступа (каталога книг) и последовательного заполнения его фиктивным содержимым — пробелами; 3) объявлена процедура Load — для загрузки в каталог фактической информации (по конкретному индексу — номеру); 4) объявлена процедура View — для просмотра на дисплее записи с конкретным номером; 5) приведены примеры использования этих процедур для решения конкретных задач. Программа 18.6 with Ada.Text_IO, Ada.Direct_IO; use Ada.Text_IO; procedure Main5 is type Book is record Number : Positive; Author : String ( 1 .. 17 ) := ( others => ' ' );Name : String ( 1 .. 25 ) := ( others => ' ' ); end record; package Book_IO is new Ada.Direct_IO ( Book ); One_Book : Book; procedure Format ( N : Positive; Cat_Name : String ) is Inner : Book_IO.File_Type; -- внутренний файл begin Book_IO.Create ( File => Inner, Mode => Book_IO.Out_File, Name => Cat_Name ); for i in 1 .. N loop One_Book.Number := i; Book_IO.Write ( Inner, One_Book ); end loop; Book_IO.Close ( Inner ); |
продолжение # |
556 |
Глава 18. Ввод-вывод и файлы |
end Format; procedure Load ( One : Book; I : Book_IO.Positive_Count; Cat_Name : String ) is Inner : Book_IO.File_Type; -- внутренний файл begin Book_IO.Open ( File => Inner, Mode => Book_IO.Out_File, Name => Cat_Name ); Book_IO.Write ( Inner, One, I ); Book_IO.Close ( Inner ); end Load; procedure View ( I : Book_IO.Positive_Count; Cat_Name : String ) is One : Book; Inner : Book_IO.File_Type; -- внутренний файл begin Book_IO.Open ( File => Inner, Mode => Book_IO.In_File, Name => Cat_Name ); Book_IO.Read ( Inner, One, I ); Put ("Number is "); Put ( Positive'Image (One.Number)); New_Line; Put ("Author is "); Put_Line ( One.Author ); Put ("Name is "); Put_Line ( One.Name ); Book_IO.Close ( Inner ); end View; File_Name : constant String := "Catalog.txt"; begin -- начало программы Format ( 10_000, File_Name ); -- форматирование каталога One_Book.Number := 10; One_Book.Author := "Н.Гоголь"; One_Book.Name := "Ревизор"; Load ( One_Book, 10, File_Name ); -- запись в каталог One_Book.Number := 20; One_Book.Author := "М.Лермонтов"; One_Book.Name := "Демон"; Load ( One_Book, 20, File_Name ); -- запись в каталог View ( 20, File_Name ); -- просмотр 20-й записи end Main5; -- конец программы |