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. Реализация может ограничить число файлов, которые могут быть связаны с данным внешним файлом. В этом случае результат такого разделения внешнего файла несколькими объектами файлового типа зависит от реализации.
Файлы последовательного и прямого доступа
Для внешних файлов определены последовательный доступ и прямой доступ. В настраиваемых пакетах SEQUENT1AL_IO и DIRECT_IO описаны соответствующие файловые типы и связанные с ними операции. Объект файлового типа, используемый для последовательного доступа, называется последовательным файлом, а используемый для прямого доступа — прямым файлом.
При последовательном доступе файл рассматривается как последовательность значений, которые передаются в порядке их поступления (от программы или из окружения). Если файл открывается, то передача начинается с начала файла.
При прямом доступе файл рассматривается как набор элементов, занимающих последовательные позиции в линейном порядке; значение может быть передано в элемент файла (или из него), находящийся в любой выбранной позиции. Позиция элемента задается его индексом, который является положительным числом определяемого реализацией целого типа COUNT.
Индекс первого элемента в файле (если он есть) равен единице; индекс последнего элемента (если он есть) называется текущим размером; текущий размер файла, не содержащего ни одного элемента, равен нулю. Текущий размер - это характеристика внешнего файла.
Открытый прямой файл имеет текущий индекс, который будет использован операцией для чтения или записи. При открытии прямого файла значение текущего индекса устанавливается равным единице. Текущий индекс прямого файла — это характеристика не внешнего файла, а связанного с ним объекта файлового типа.
Для прямых файлов допустимы все три вида файла. Для последовательных файлов допустимы только виды IN_FILE и OUT_FILE.
У п р а в л е н и е файлами
В этом разделе описаны процедуры и функции, предназначенные для управления внешними файлами; их описания повторены в каждом из трех пакетов последовательного, прямого и текстового ввода-вывода. Процедуры CREATE, OPEN и RESET при вводе-выводе текстов имеют дополнительные эффекты, описанные в разд. 14.3.1.
procedure CREATE (FILE: in out FILE_TYPE;
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.
С п е ц и ф и к а ц и я пакета последовательного ввода-вывода
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;
Прямой ввод - вывод
В этом разделе описаны операции для прямого ввода и вывода. При применении любой из этих операций над файлом, который не открыт, возбуждается исключение 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.
С п е ц и ф и к а ц и я пакета прямого ввода-вывода
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. .определяется ^реализацией: