end SEQUENTIAL-10;

Для определения последовательного ввода-вывода элементов данного типа должна быть описана конкретизация этого настраиваемого модуля с фактическим параметром данного типа. Результат настройки содержит опи­сание файлового типа (названного FILE-TYPE) для файлов с такими эле­ментами, а также операции над этими файлами; например, процедуры OPEN, READ и WRITE.

Ввод-вывод для файлов прямого доступа определен аналогичным спо­собом в настраиваемом пакете DIRECT—10. Ввод-вывод в текстовой форме определен в (ненастраиваемом) пакете ТЕХТ_ 10.

До выполнения ввода или вывода как операции над файлом должна быть установлена связь файла с внешним файлом. Когда такая связь уста­новлена, файл называется открытым, в противном случае — закрытым.

В языке не определено, что происходит с внешними файлами после за­вершения работы главной программы (в частности, если соответствующие файлы не были закрыты). Результат выполнения ввода-вывода над ссылоч­ными типами зависит от реализации.

Открытый файл имеет текущий вид, который является значением одно­го из перечислимых типов:

type FILE MODE is (IN_FILE, INOUT_FILE, OUT.FILE); - - для DIRECT„IO

type FILE MODE is (IN_FILE, OUT_FILE); - - для SEQUENTIAL-10 и TEXT_IO

Эти значения соответствуют случаям, когда можно осуществить либо только чтение, либо чтение и запись, либо только запись. Вид файла может быть изменен.

Некоторые из операций управления файлами являются общими для всех трех пакетов ввода-вывода. Эти операции над последовательными фай­лами и файлами прямого доступа описаны в разд. 14.2.1. Дополнительные особенности ввода-вывода текстов описаны в разд. 14.3.1.

В пакете IO__EXCEPTIONS определены все исключения, которые могут быть возбуждены при вызове подпрограммы ввода-вывода; ситуации их возбуждения описаны либо при описании подпрограмм ввода и вывода (и в разд. 14.4), либо в руководстве по реализации в соответствии с обяза­тельным приложением 4 для ошибочных ситуаций, зависящих от реали­зации.

Примечание. Каждая конкретизация настраиваемых пакетов SEQUENTIAL IO и DIRECT IO задает разные типы FILE TYPE; уникальным является тип FILE_TYPE в пакете ТЕХЇІО.

Устройство с двусторонней связью часто может быть промоделировано двумя файлами с последовательным доступом, связанными с этим устройством; один - вида IN FILE, а другой - вида OUT_FILE. Реализация может ограничить число файлов, ко­торые могут быть связаны с данным внешним файлом. В этом случае результат такого разделения внешнего файла несколькими объектами файлового типа зависит от реали­зации.

  1. Файлы последовательного и прямого доступа

Для внешних файлов определены последовательный доступ и прямой доступ. В настраиваемых пакетах SEQUENT1AL_IO и DIRECT_IO описаны соответствующие файловые типы и связанные с ними операции. Объект файлового типа, используемый для последовательного доступа, называется последовательным файлом, а используемый для прямого доступа — пря­мым файлом.

При последовательном доступе файл рассматривается как последова­тельность значений, которые передаются в порядке их поступления (от про­граммы или из окружения). Если файл открывается, то передача начинается с начала файла.

При прямом доступе файл рассматривается как набор элементов, зани­мающих последовательные позиции в линейном порядке; значение может быть передано в элемент файла (или из него), находящийся в любой вы­бранной позиции. Позиция элемента задается его индексом, который явля­ется положительным числом определяемого реализацией целого типа COUNT.

Индекс первого элемента в файле (если он есть) равен единице; индекс по­следнего элемента (если он есть) называется текущим размером; текущий размер файла, не содержащего ни одного элемента, равен нулю. Текущий размер - это характеристика внешнего файла.

Открытый прямой файл имеет текущий индекс, который будет исполь­зован операцией для чтения или записи. При открытии прямого файла зна­чение текущего индекса устанавливается равным единице. Текущий индекс прямого файла — это характеристика не внешнего файла, а связанного с ним объекта файлового типа.

Для прямых файлов допустимы все три вида файла. Для последователь­ных файлов допустимы только виды IN_FILE и OUT_FILE.

  1. У п р а в л е н и е файлами

В этом разделе описаны процедуры и функции, предназначенные для управления внешними файлами; их описания повторены в каждом из трех пакетов последовательного, прямого и текстового ввода-вывода. Процеду­ры CREATE, OPEN и RESET при вводе-выводе текстов имеют дополнитель­ные эффекты, описанные в разд. 14.3.1.

procedure CREATE (FILE: in out FILE_TYPE;

  1. 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 OPEN (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 (все такие случаи должны быть описаны в руководстве по реализации в соответствии с обязательным приложением 4).

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 1TLE_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.2.2. Последовательный ввод-вывод

В этом разделе описаны операции для последовательного ввода и вы­вода. В случае применения любой из этих операций к закрытому файлу возбуждается исключение STATUS-ERROR.

procedure READ (FILE: in FILE_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.

  1. С п е ц и ф и к а ц и я пакета последовательного ввода-вывода

with IO „EXCEPTIONS;

generic

type ELEMENT_TYPE is private;

package SEQUENTIAL „10 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 FILEJYPE) 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 JO;

  1. Прямой ввод - вывод

В этом разделе описаны операции для прямого ввода и вывода. При применении любой из этих операций над файлом, который не открыт, воз­буждается исключение STATUS—ERROR.

procedure READ (FILE: in FILE TYPE;

ITEM: out ELEMENTJTYPE;

FROM: in POSITIVECOUNT);

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 или OUTFILE. Первая из операций предварительно устанавливает индекс данного файла равным зна­чению параметра ТО. Затем (для обеих подпрограмм) элементу данного файла, позиция которого указана текущим индексом, присваивает значение параметра 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.

  1. С п е ц и ф и к а ц и я пакета прямого ввода-вы­вода

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. .определяется ^реализацией: