Для внешних файлов определены два сорта доступа: последовательный доступ и прямой доступ. В настраиваемых пакетах SEQUENTIAL_IO и DIRECT_IO описаны соответствующие файловые типы и связанные с ними операции. Объект файлового типа, используемый для последовательного доступа, называется последовательным файлом, а используемый для прямого доступа — прямым файлом.
При последовательном доступе файл рассматривается как последовательность значений, которые передаются в порядке их поступления (от программы или из окружения). Если файл открыт, то передача начинается с начала файла.
При прямом доступе файл рассматривается как набор элементов, занимающих последовательные позиции в линейном порядке; значение может быть передано в элемент файла (или из него), находящийся в любой выбранной позиции. Позиция элемента задается его индексом, который является положительным числом определяемого реализацией целого типа COUNT. Индекс первого элемента в файле (если он есть) равен единице; индекс последнего элемента (если он есть) называется текущим размером; текущий размер файла, не содержащего ни одного элемента, равен нулю. Текущий размер — это характеристика внешнего файла.
Открытый прямой файл имеет текущий индекс, который будет использован следующей операцией для чтения или записи. По открытии прямого файла значение текущего индекса устанавливается равным единице. Текущий индекс прямого файла — это характеристика не внешнего файла, а связанного с ним объекта файлового типа.
Для прямых файлов допустимы все три вида файла. Для последовательных файлов допустимы только виды IN_FILE и OUT_FILE.
Ссылки: вид файла 14.1, тип 14.3, файл вида IN_FILE 14.1, файл вида OUT_FILE 14.1.
14.2.1. УПРАВЛЕНИЕ ФАЙЛАМИ
В этом разделе описаны процедуры и функции, предназначенные для управления внешними файлами; их описания повторены в каждом из трех пакетов последовательного, прямого и текстового ввода-вывода. Процедуры CREATE, OPEN и RESET при вводе-выводе текстовимеют дополнительные эффекты, описанные в разд. 14,3.1.
procedure OPEN( FILE : in out FILE_TYPE; MODE : in FILE_MODE; NAME : in STRING; FORM : in STRING := "");
Устанавливает новый внешний файл с данным именем и формой и связывает его с данным файлом (FILE). После этого данный файл открывается. Текущий вид файла устанавливается в заданный вид доступа (MODE). По умолчанию для последовательного и текстового ввода-вывода устанавливается вид OUT_FILE, а для прямого ввода-вывода — INOUT_FILE. Для прямого доступа размер созданного файла зависит от реализации. Пустая строка под именем (NAME) задает внешний файл, который не доступен после окончания главной программы (временный файл). Пустая строка для формы (FORM) задает параметры по умолчанию, определяемые реализацией для внешнего файла.
Если данный файл уже открыт, то возбуждается исключение STATUS_ERROR. Если указанная в качестве параметра NAME строка не допускает идентификацию внешнего файла, то возбуждается исключение NAME_ERROR. Если для заданного вида файла окружение не может обеспечить создание внешнего файла с заданными именем и формой, то возбуждается исключение USE_ERROR (в отсутствие возбуждения исключения NAME_ERROR).
procedure CREATE(FILE : in out FILE_TYPE; MODE in FILE_MODE :=вид по умолчанию; NAME in STRING := ""; FORM in STRING := "");
Связывает данный файл с существующим внешним файлом, имеющим данные имя и форму, а текущий вид данного файла устанавливается параметром MODE. Данный файл открывается.
Если данный файл уже открыт, то возбуждается исключение STATUS_ERROR. Если строка, заданная параметром NAME, не допускает идентификацию внешнего файла, то возбуждается исключение NAME_ERROR; в частности, это исключение возбуждается, если внешнего файла с указанным именем не существует. Если для заданного вида файла окружение не может обеспечить открытие внешнего файла с данными именем и формой, то возбуждается исключение USE_ERROR (в отсутствие возбуждения исключения NAME_ERROR).
procedure CLOSE(FILE : in out FILE_TYPE);
Уничтожает связь между данным файлом и соответствующим ему внешним файлом. Данный файл закрывается.
Если данный файл не открыт, то возбуждается исключение STATUS_ERROR.
procedure DELETE(FILE : in out FILE_TYPE);
Уничтожает внешний файл, связанный с данным файлом. Данный файл закрывается, внешний файл прекращает существование.
Если данный файл не открыт, то возбуждается исключение STATUS_ERROR. Если уничтожение внешнего файла не может быть обеспечено окружением, то возбуждается исключение USE_ERROR (все такие случаи должны быть описаны в приложении F).
procedure RESET(FILE : in out FILE_TYPE; MODE : in FILE_MODE);procedure RESET(FILE : in out FILE_TYPE);
Устанавливает данный файл в состояние, позволяющее возобновить чтение или запись значений его элементов с начала файла; в частности, для прямого доступа это означает, что текущий индекс становится равным единице. Если задан параметр MODE, то в соответствии с ним устанавливается текущий вид данного файла.
Если файл не открыт, то возбуждается исключение STATUS_ERROR. Если для внешнего файла окружение не может осуществить возврат к началу файла или установку данного вида, то возбуждается исключение USE_ERROR.
function MODE(FILE : in FILE_TYPE) return FILE_MODE;
Возвращает текущий вид данного файла.
Если файл не открыт, то возбуждается исключение STATUS_ERROR.
function NAME(FILE : in FILE_TYPE) return STRING;
Возвращает строку, которая однозначно идентифицирует внешний файл, связанный с данным файлом (она может быть использована в операции OPEN). Если окружение допускает альтернативные спецификации имени (например, сокращения), то возвращаемая функцией строка обязана соответствовать полной спецификации имени.
Если данный файл не открыт, то возбуждается исключение STATUS_ERROR.
function FORM(FILE : in FILE_TYPE) return STRING;
Возвращает строку, определяющую форму внешнего файла, связанного в этот момент с данным файлом. Если окружение допускает альтернативные спецификации форм (например, сокращения, использующие возможности по умолчанию), то возвращаемая функцией строка обязана соответствовать полной спецификации (т.е. она обязана явно содержать все выбранные возможности, включая возможности по умолчанию).
Если данный файл не открыт, то возбуждается исключение STATUS_ERROR.
function IS_OPEN(FILE : in FILE_TYPE) return BOOLEAN;
Если файл открыт (т.е. связан с внешним файлом), то возвращает значение TRUE, в противном случае — FALSE.
Ссыпки: вид 14.1, внешний файл 14.1, закрытый файл 14.1, исключение NAME_ERROR 14.4, исключение STATUS_ERROR 14.4, исключение USE_ERROR 14.4, OUT_FILE 14.1, открытый файл 14.1, поименованная строка 14.1, прямой доступ 14.2, текущий вид 14.1, текущий размер 14.1, тип FILE_MODE 14.1, тип FILE_TYPE 14.1, файл 14.1, файл вида INOUT_FILE 14.2.4, форма файла 14.1.
14.2.2. ПОСЛЕДОВАТЕЛЬНЫЙ ВВОД-ВЫВОДА
В этом разделе описаны операции для последовательного ввода и вывода. В случае применения любой из этих операций к закрытому файлу возбуждается исключение STATUS_ERROR.
procedure READ(FILE : in FlLE_TYPE; ITEM : out ELEMENT_TYPE);
Оперирует над файлом вида IN_FILE. Читает элемент данного файла и возвращает значение этого элемента через параметр ITEM.
Если вид файла не IN_FILE, то возбуждает исключение MODE_ERROR. Если из файла нельзя больше читать ни одного элемента, то возбуждает исключение END_ERROR. Если прочитанный элемент не может быть интерпретирован как значение типа ELEMENT_TYPE, то возбуждается исключение DATA_ERROR; однако для реализации допустимо опускать такую проверку в случае, если она слишком сложна.
procedure WRITE_FILE : in FILE_TYPE; ITEM : in ELEMENT_TYPE);
Оперирует над файлом вида OUT_FILE. Записывает в данный файл значение параметра ITEM.
Если вид файла не OUT_FILE, то возбуждается исключение MODE_ERROR. Если внешний файл уже заполнен до конца, то возбуждается исключение USE_ERROR.
function END_OF_FILE(FILE : in FILE_TYPE) return BOOLEAN;
Оперирует над файлом вида IN_FILE. Если из файла больше нельзя читать ни одного элемента, то возвращает значение TRUE, в противном случае — FALSE.
Если вид файла не IN_FILE, то возбуждается исключение MODE_ERROR. Ссылки: вид IN_FILE 14.1, вид OUT_FILE 14.1, вид файла 14.1, внешний файл 14.1, исключение DATA_ERROR 14.4, исключение END_ERROR 14.4, исключение MODE_ERROR 14.1, ис-. ключение STATUS_ERROR 14.4, исключение USE_ERROR 14.4, тип ELEMENT_TYPE 14.1, фай/i ; 14.1, файловый тип 14.1, элемент 14.1.
14.2.3. СПЕЦИФИКАЦИЯ ПАКЕТА ПОСЛЕДОВАТЕЛЬНОГО ВВОДА-ВЫВОДА
with IO_EXCEPTIONS;generic type ELEMENT_TYPE is private;package SEQUENTIAL_IO is type FILE_TYPE is limited private; type FILE_MODE is (IN_FILE, OUT_FILE); -- управление файлами procedure CREATE(FILE : in out FILE_TYPE; MODE : in FILE_MODE := OUT_FILE; NAME : in STRING := ""; FORM : in STRING := ""); procedure OPEN (FILE : in out FILE_TYPE; MODE : in FILE_MODE; NAME : in STRING; FORM : in STRING := ""); procedure CLOSE (FILE : in out FILE_TYPE); procedure DELETE(FILE : in out FILE_TYPE); procedure RESET (FILE : in out FILE_TYPE; MODE : in FILE_MODE); procedure RESET (FILE : in out FILE_TYPE); function MODE (FILE : in FILE_TYPE) return FILE_MODE; function NAME (FILE : in FILE_TYPE) return STRING; function FORM (FILE : in FILE_TYPE) return STRING; function IS_OPEN(FILE : in FILE_TYPE) return BOOLEAN; -- операции ввода и вывода procedure READ (FILE : in FILE_TYPE; ITEM : out ELEMENT_TYPE); procedure WRITE (FILE : in FILE_TYPE; ITEM : in ELEMENT_TYPE); function END_OF_FILE(FILE : in FILE_TYPE) return BOOLEAN; -- исключения STATUS_ERROR : exception renames IO_EXCEPTIONS.STATUS_ERROR; MODE_ERROR : exception renames IO_EXCEPTIONS.MODE_ERROR; NAME_ERROR : exception renames IO_EXCEPTIONS.NAME_ERROR; USE_ERROR : exception renames IO_EXCEPTIONS.USE_ERROR; DEVICE_ERROR : exception renames IO_EXCEPTIONS.DEVICE_ERROR; END_ERROR : exception renames IO_EXCEPTIONS.END_ERROR; DATA_ERROR : exception renames IO_EXCEPTIONS.DATA_ERROR; private -- зависит от реализацииend SEQUENTIAL_IO;
Ссылки: вид IN_FILE 14.1, вид OUT_FILE 14.1, исключение DATA_ERROR 14.4, исключение DEVICE_ERROR 14.4, исключение END_ERROR 14.4, исключение MODE_ERROR 14.4, исключение NAME_ERROR 14.4, исключение STATUS_ERROR 14.4, исключение USE_ERROR 14.4, пакет исключений Ю-EXCEPTIONS 14.4, пакет SEQUENTIAL_IO 14.2, 14.2.2, процедура CLOSE 14.2.1, процедура CREATE 14.2.1, процедура DELETE 14.2.1, процедура OPEN 14.2.1, процедура READ 14.2.2, процедура RESET 14.2.1, процедура WRITE 14.2.2, тип FILE_MODE 14.1, тип FILE_TYPE 14.1, функция END-OF_FILE 14.2.2, функция FORM 14.2.1, функция IS-OPEN 14.2.1, функция MODE 14.2.1, функция NAME 14.2.1.
14.2.4. ПРЯМОЙ ВВОД-ВЫВОД
В этом разделе описаны операции для прямого ввода и вывода. При применении любой из этих операций к файлу, который не открыт, возбуждается исключение STATUS_ERROR.
procedure READ(FILE : in FILE_TYPE; ITEM out ELEMENT_TYPE; FROM : in POSITIVE_COUNT);procedure READ(FILE : in FILE_TYPE; ITEM out ELEMENT_TYPE);
Оперируют над файлами вида IN_FILE или INOUT_FILE. Первая из операций предварительно устанавливает текущий индекс данного файла равным значению параметра FROM. Затем (для обеих подпрограмм) через параметр ITEM возвращает значение элемента файла, позиция которого задана текущим индексом файла; наконец, увеличивает текущий индекс на единицу.
Если вид данного файла — OUT_FILE, то возбуждается исключение MODE_ERROR. Если используемое при чтении значение индекса оказалось больше размера внешнего файла, то возбуждается исключение END_ERROR. Если прочитанный элемент нельзя интерпретировать как значение типа ELEMENT_TYPE, то возбуждается исключение DATA_ERROR; однако для реализации допустимо опускать такую проверку в случае, если она слишком сложна.
procedure WRITE(FILE : in FILE_TYPE; ITEM : in ELEMENT_TYPE; TO : in POSITIVE_COUNT);procedure WRITE(FILE : in FILE_TYPE; ITEM : in ELEMENT_TYPE);
Оперируют над файлами вида INOUT_FILE или OUT_FILE. Первая из операций предварительно устанавливает индекс данного файла равным значению параметра ТО. Затем (для обеих подпрограмм) элементу данного файла, позиция которого указана текущим индексом, присваивается значение параметра ITEM; наконец, увеличивается текущий индекс на единицу.
Если вид данного файла — IN_FILE, то возбуждается исключение MODE_ERROR. Если внешний файл заполнен до конца, то возбуждается исключение USE_ERROR.
procedure SET_INDEX( FILE : in FILE_TYPE; TO : in POSITIVE_COUNT);
Оперирует над файлом любого вида. Устанавливает текущий индекс данного файла равным значению параметра ТО (которое может превышать текущий размер файла).
function INDEX(FILE : in FILE_TYPE) return POSITIVE_COUNT;
Оперирует над файлом любого вида. Возвращает текущий индекс данного файла.
function SIZE(FILE : in FILE_TYPE) return COUNT;
Оперирует над файлом любого вида. Возвращает текущий размер внешнего файла, связанного с данным файлом.
function END_OF_FILE(FILE : in FILE_TYPE) return BOOLEAN;
Оперирует над файлом вида IN_FILE или INOUT_FILE. Если значение текущего индекса больше размера внешнего файла, то возвращает значение TRUE, в противном случае — FALSE. Если вид данного файла — OUT_FILE, то возбуждается исключение MODE_ERROR. Ссылки: вид IN_FILE 14.1, вид INOUT_FILE 14.1, вид файла 14.1, внешний файл 14.1, индекс 14.2, исключение DATA_ERROR 14.4, исключение END_ERROR 14.4, исключение MODE_ERROR 14.4, исключение STATUS_ERROR 14.4, исключение USE_ERROR 14.4, открытый файл 14.1, текущий индекс 14.2, текущий размер 14.2, тип ELEMENT_TYPE 14.1, тип COUNT 14.2, тип POSITIVE_COUNT 14.3, тип FILE_TYPE 14.1, файл 14.1, элемент 14.1.
14.2.5. СПЕЦИФИКАЦИЯ ПАКЕТА ПРЯМОГО ВВОДА-ВЫВОДА
with IO_EXCEPTIONS;generic type ELEMENT_TYPE is private;package DIRECT_IO is type FILE_TYPE is limited private; type FILE_MODE is (IN_FILE, INOUT_FILE, OUT_FILE); type COUNT is range 0 .. implementation defined; subtype POSITIVE_COUNT is COUNT range 1 .. COUNT'LAST; -- управление файлами procedure CREATE(FILE : in out FILE_TYPE; MODE : in FILE_MODE := INOUT_FILE; NAME : in STRING := ""; FORM : in STRING := ""); procedure OPEN (FILE : in out FILE_TYPE; MODE : in FILE_MODE; NAME : in STRING; FORM : in STRING := ""); procedure CLOSE (FILE : in out FILE_TYPE); procedure DELETE(FILE : in out FILE_TYPE); procedure RESET (FILE : in out FILE_TYPE; MODE : in FILE_MODE); procedure RESET (FILE : in out FILE_TYPE); function MODE (FILE : in FILE_TYPE) return FILE_MODE; function NAME (FILE : in FILE_TYPE) return STRING; function FORM (FILE : in FILE_TYPE) return STRING; function IS_OPEN(FILE : in FILE_TYPE) return BOOLEAN; -- операции ввода и вывода procedure READ (FILE : in FILE_TYPE; ITEM : out ELEMENT_TYPE; FROM : POSITIVE_COUNT); procedure READ (FILE : in FILE_TYPE; ITEM : out ELEMENT_TYPE); procedure WRITE(FILE : in FILE_TYPE; ITEM : in ELEMENT_TYPE; TO : POSITIVE_COUNT); procedure WRITE(FILE : in FILE_TYPE; ITEM : in ELEMENT_TYPE); procedure SET_INDEX(FILE : in FILE_TYPE; TO : in POSITIVE_COUNT); function INDEX(FILE : in FILE_TYPE) return POSITIVE_COUNT; function SIZE (FILE : in FILE_TYPE) return COUNT; function END_OF_FILE(FILE : in FILE_TYPE) return BOOLEAN; -- исключения STATUS_ERROR : exception renames IO_EXCEPTIONS.STATUS_ERROR; MODE_ERROR : exception renames IO_EXCEPTIONS.MODE_ERROR; NAME_ERROR : exception renames IO_EXCEPTIONS.NAME_ERROR; USE_ERROR : exception renames IO_EXCEPTIONS.USE_ERROR; DEVICE_ERROR : exception renames IO_EXCEPTIONS.DEVICE_ERROR; END_ERROR : exception renames IO_EXCEPTIONS.END_ERROR; DATA_ERROR : exception renames IO_EXCEPTIONS.DATA_ERROR; private -- зависит от реализацииend DIRECT_IO;
Ссылки: вид OUT_FILE 14.2.1, вид IN_FILE 14.2.4, вид по умолчанию 14.2.5, исключение DATA_ERROR 14.4, исключение DEVICE_ERROR 14.4, исключение END_ERROR 14.4, исключение MODE_ERROR 14.4, исключение NAME_ERROR 14.4, исключение STATUS_ERROR 14.4, исключение USE_ERROR 14.4, пакет Ю-EXCEPTION 14.4, процедура CLOSE 14.2.1, процедура CREATE 14.2.1, процедура DELETE 14.2.1, процедура OPEN 14.2.1, процедура SET-INDEX 14.2.4, процедура READ 14.2.4, процедура WRITE 14.2.4, 14.2.1, тип ELEMENT_TYPE 14.2.4, тип COUNT
14.2. тип FILE_MODE 14.2.5, тип FILE_TYPE 14.2.4, файл ввода-вывода 14.2.4, 14.2.1, функция END-OF_FILE 14.2.4, функция FROM 14.2.1, функция INDEX 14.2.4, функция IS-OPEN 14.2.1, функция MODE 14.2.1, функция NAME 14.2.1, функция SIZE 14.2.4.