Справочник Ada 2005
A.7 Внешние файлы и объекты файлов
Статическая семантика
Значения, вводимые из внешней среды программы или выводимые во внешнюю среду, считаются занимающими внешние файлы. Внешний файл может быть чем угодно внешним по отношению к программе, что может производить значение для чтения или получать значение для записи. Внешний файл идентифицируется строкой (имя). Вторая строка (формат) предоставляет дополнительные, зависящие от системы характеристики, которые могут быть связаны с файлом, такие как физическая организация или права доступа. Конвенции, определяющие интерпретацию таких строк, должны быть задокументированы.
Операции ввода-вывода выражаются как операции над объектами некоторого типа файла, а не непосредственно в терминах внешних файлов. В оставшейся части этого раздела термин файл всегда используется для ссылки на объект файла; термин внешний файл используется в противном случае.
Ввод-вывод для последовательных файлов значений одного элементарного типа определяется с помощью обобщённого пакета Sequential_IO. Для определения последовательного ввода-вывода для заданного типа элемента необходимо объявить экземпляр этого обобщённого модуля с заданным типом в качестве фактического параметра. Результирующий пакет содержит объявление типа файла (называемого File_Type) для файлов таких элементов, а также операций, применимых к этим файлам, таких как процедуры Open, Read и Write.
Ввод-вывод для файлов прямого доступа также определяется обобщённым пакетом Direct_IO. Ввод-вывод в удобочитаемом формате определяется (не обобщёнными) пакетами Text_IO для данных Character и String, Wide_Text_IO для данных Wide_Character и Wide_String и Wide_Wide_Text_IO для данных Wide_Wide_Character и Wide_Wide_String. Ввод-вывод для файлов, содержащих потоки элементов, представляющих значения, возможно, разных типов, определяется (не обобщённым) пакетом Streams.Stream_IO.
Прежде чем можно будет выполнить операции ввода-вывода с файлом, файл сначала должен быть связан с внешним файлом. Пока такое сопоставление действует, файл считается открытым, в противном случае файл считается закрытым.
Язык не определяет, что происходит с внешними файлами после завершения основной программы и всех задач библиотеки (в частности, если соответствующие файлы не были закрыты). Эффект ввода-вывода для типов доступа не определён.
Открытый файл имеет текущий режим, который является значением одного из следующих типов перечисления:
type File_Mode is (In_File, Inout_File, Out_File); -- для Direct_IO
Эти значения соответствуют, соответственно, случаям, когда необходимо только чтение, чтение и запись или только запись.
type File_Mode is (In_File, Out_File, Append_File);
-- для Sequential_IO, Text_IO, Wide_Text_IO, Wide_Wide_Text_IO и Stream_IO
-- для Sequential_IO, Text_IO, Wide_Text_IO, Wide_Wide_Text_IO и Stream_IO
Эти значения соответствуют, соответственно, случаям, когда требуется только чтение, только запись или только добавление.
Режим файла может быть изменён.
Несколько операций управления файлами являются общими для Sequential_IO, Direct_IO, Text_IO, Wide_Text_IO и Wide_Wide_Text_IO. Эти операции описаны в подпункте A.8.2 для последовательных и прямых файлов. Любые дополнительные эффекты, касающиеся текстового ввода-вывода, описаны в подпункте A.10.2.
Исключения, которые могут быть распространены выполнением подпрограммы ввода-вывода, определены в пакете IO_Exceptions; ситуации, в которых они могут быть распространены, описаны после описания подпрограммы (и в разделе A.13). Могут быть распространены исключения Storage_Error и Program_Error. (Program_Error может быть распространён только из-за ошибок, допущенных вызывающей подпрограммой.) Наконец, исключения могут быть распространены в определённых ситуациях, определяемых реализацией.
ПРИМЕЧАНИЯ
18 Каждый экземпляр обобщённых пакетов Sequential_IO и Direct_IO объявляет различный тип File_Type. В случае Text_IO, Wide_Text_IO, Wide_Wide_Text_IO и Streams.Stream_IO соответствующий тип File_Type уникален.
19 Двунаправленное устройство часто можно смоделировать как два последовательных файла, связанных с устройством, один из которых имеет режим In_File, а другой — Out_File. Реализация может ограничить количество файлов, которые могут быть связаны с заданным внешним файлом.