Справочник по Аде (Ada 2022)
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 может быть распространен только из-за ошибок, допущенных вызывающей подпрограммой.) Наконец, исключения могут быть распространены в определенных ситуациях, зависящих от реализации.
ПРИМЕЧАНИЕ 1 Каждый экземпляр обобщенных пакетов Sequential_IO и Direct_IO объявляет другой тип File_Type. В случае Text_IO, Wide_Text_IO, Wide_Wide_Text_IO и Streams.Stream_IO соответствующий тип File_Type является уникальным.
ПРИМЕЧАНИЕ 2 Двунаправленное устройство часто можно смоделировать как два последовательных файла, связанных с устройством, один из которых имеет режим In_File, а другой — Out_File. Реализация может ограничить количество файлов, которые могут быть связаны с данным внешним файлом.