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