Файлы последовательного и прямого доступа
Для внешних файлов определены два сорта доступа: последовательный доступ и прямой доступ. В настраиваемых пакетах SEQUENTIAL_IO и DIRECT_IO описаны соответствующие файловые типы и связанные с ними операции. Объект файлового типа, используемый для последовательного доступа, называется последовательным файлом, а используемый для прямого доступа — прямым файлом.
При последовательном доступе файл рассматривается как последовательность значений, которые передаются в порядке их поступления (от программы или из окружения). Если файл открыт, то передача начинается с начала файла.
При прямом доступе файл рассматривается как набор элементов, занимающих последовательные позиции в линейном порядке; значение может быть передано в элемент файла (или из него), находящийся в любой выбранной позиции. Позиция элемента задается его индексом, который является положительным числом определяемого реализацией целого типа COUNT. Индекс первого элемента в файле (если он есть) равен единице; индекс последнего элемента (если он есть) называется текущим размером; текущий размер файла, не содержащего ни одного элемента, равен нулю. Текущий размер — это характеристика внешнего файла.
Открытый прямой файл имеет текущий индекс, который будет использован следующей операцией для чтения или записи. По открытии прямого файла значение текущего индекса устанавливается равным единице. Текущий индекс прямого файла — это характеристика не внешнего файла, а связанного с ним объекта файлового типа.
Для прямых файлов допустимы все три вида файла. Для последовательных файлов допустимы только виды IN_FILE и OUT_FILE.
Ссылки: вид файла 14.1, тип 14.3, файл вида IN_FILE 14.1, файл вида OUT_FILE
1. УПРАВЛЕНИЕ ФАЙЛАМИ
В этом разделе описаны процедуры и функции, предназначенные для управления внешними файлами; их описания повторены в каждом из трех пакетов последовательного, прямого и текстового ввода-вывода. Процедуры CREATE, OPEN и RESET при вводе-выводе текстовимеют дополнительные эффекты, описанные в разд. 14,
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 4, форма файла
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, элемент
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, 2, процедура CLOSE 1, процедура CREATE 1, процедура DELETE 1, процедура OPEN 1, процедура READ 2, процедура RESET 1, процедура WRITE 2, тип FILE_MODE 14.1, тип FILE_TYPE 14.1, функция END-OF_FILE 2, функция FORM 1, функция IS-OPEN 1, функция MODE 1, функция NAME 1.
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, элемент
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 1, вид IN_FILE 4, вид по умолчанию 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 1, процедура CREATE 1, процедура DELETE 1, процедура OPEN 1, процедура SET-INDEX 4, процедура READ 4, процедура WRITE 4, 1, тип ELEMENT_TYPE 4, тип COUNT
тип FILE_MODE 5, тип FILE_TYPE 4, файл ввода-вывода 4, 1, функция END-OF_FILE 4, функция FROM 1, функция INDEX 4, функция IS-OPEN 1, функция MODE 1, функция NAME 1, функция SIZE 4.
Ввод-вывод
Ввод-вывод в языке обеспечивается предопределенными пакетами. Настраиваемые пакеты SEQUENTIAL_IO и DIRECT_IO определяют операции ввода-вывода, которые применимы для файлов с элементами данного типа. В пакете TEXT_IO даны дополнительные операции ввода-вывода текстов. В пакете IO_EXCEPTIONS определены исключения, необходимые при работе трех указанных пакетов. Наконец, пакет LOW_LEVEL_IO позволяет осуществлять непосредственное управление периферийными устройствами.
Ссылки: пакет DIRECT_IO 14.2, 4, пакет IO_EXCEPTIONS 14.5, пакет LOW_LEVEL_IO 14.6, пакет SEQUENTIAL_IO 14.2, 2, пакет TEXT_IO
Исключения при вводе-выводе
В этом разделе описаны исключения, которые могут быть возбуждены при выполнении операций ввода-вывода. Они описаны в пакете IO_EXCEPTIONS; определение этого пакета приведено в разд. Этот пакет упоминается в спецификаторах контекста каждого из трех описанных пакетов ввода-вывода. Для исключений NAME_ERROR, USE_ERROR и DEVICE_ERROR описаны общие характеристики условий возбуждения этих исключений; детальное описание должно быть приведено в приложении F. Если существует более чем одно ошибочное условие, соответствующее одному исключению, то возбуждается то из них, которое раньше описано в данном ниже списке исключений.
Исключение STATUS_ERROR возбуждается при попытке выполнить действия над еще не открытым файлом или при попытке открыть уже открытый файл.
Исключение MODE_ERROR возбуждается при попытке чтения или проверке конца файла с текущим видом OUT_FILE, а также при попытке записи в файл с текущим видом IN_FILE. Для пакета TEXT_IO исключение MODE_ERROR возбуждается также при использовании файла с текущим видом OUT_FILE в качестве параметра подпрограмм SET_INPUT, SKIP_LINE, END_OF_LINE, SKIP_PAGE и END_OF_PAGE и при использовании файла с текущим видом IN_FILE в качестве параметра подпрограммы SET_OUTPUT, SET_LINE_LENGTH, SET_PAGE_LENGTH, LINE_LENGTH, PAGE_LENGTH, NEW_LINE или NEW_PAGE.
Исключение NAME_ERROR возбуждается при вызове процедур CREATE и OPEN, если строка, заданная параметром NAME, не позволяет идентифицировать внешний файл. Например, это исключение возбуждается, если такая строка вообще недопустима или если ей либо не соответствует ни один внешний файл, либо соответствует несколько внешних файлов.
Исключение USE_ERROR возбуждается при попытке выполнить операцию, не разрешенную по причинам, зависящим от характеристик внешнего файла. Например, процедурой CREATE такое исключение может быть возбуждено при задании параметром MODE вида OUT_FILE, а параметром FORM устройства, допускающего только ввод, либо при задании параметром FORM неверных прав доступа, либо если внешний файл с данным именем уже существует и перезапись недопустима.
Исключение DEVICE_ERROR возбуждается при невозможности завершения операции ввода-вывода из-за неисправностей в используемой системе.
Исключение END_ERROR возбуждается при попытке пропустить признак конца файла (чтение за концом файла).
Исключение DATA_ERROR может быть возбуждено процедурой READ, если читаемый элемент нельзя интерпретировать как значение требуемого типа. Это же исключение возбуждается процедурой GET (определенной в пакете TEXT_IO), если введенная последовательность символов не соответствует требуемому синтаксису или если введенное значение не принадлежит диапазону требуемого типа или подтипа.
Исключение LAYOUT_ERROR возбуждается (в текстовом вводе-выводе) при вызове функции COL, LINE или PAGE, если возвращаемое значение превышает COUNT'LAST. Это же исключение возбуждается при выводе: при попытке установить номер столбца или строчки, превышающий заданную максимальную длину строчки или страницы (кроме случая неограниченной длины строчки или страницы). Оно также возбуждается процедурой PUT при попытке вывести в строку слишком большое количество символов.
Ссыпки: вид IN_FILE 14.1, вид OUT_FILE 14.1, внешний файл 14.1, пакет IO_EXCEPTIONS пакет TEXT_IO 14.3, процедура GET 5, процедура CREATE 1, процедура NEW_LINE 4, процедура NEW-PAGE 4, процедура OPEN 1, процедура PUT 5, процедура READ 2, 3, процедура SET-INPUT 2, процедура SET_LINE-LENGTH 3, процедура SET-PAGE-LENGTH 3, процедура SET-OUTPUT 2, процедура SKIP_LINE 4, процедура SKIP-PAGE 14.3,4, строка FORM 14.1, строка NAME 14.1, файл 14.1, функция COL 4, функция END-OF_LINE 4, функция END-OF-PAGE 4, функция LINE 4, функция LINE-LENGTH 4, функция PAGE 4, функция PAGE-LENGTH 4.
и не выводятся; они даны
Примечание
В примерах этого раздела и в разд. 7 и 8 кавычки и строчная буква Ь не вводятся и не выводятся; они даны только для того, чтобы показать расположение и пробелы.
N : INTEGER; ... GET(N);
-— символы на входе | вводимая последовательность | значение N |
bb-12535Ь | -12535 | -12535 |
bb12_535Е1Ь | 12_535Е1 | 125350 |
bb12_535Е; | 12535Е | (нет) DATA_ERROR Возбуждено |
Пример игнорирования параметра ширины:
PUT(ITEM => -23, WIDTH => 2); -- "-23" Ссылки- вид 14.1, вид файла IN_FILE 14.1, вид файла OUT_FILE 14.1, исключение DATA_ERROR 14.4, исключение END_ERROR 14.4, исключение LAYOUT_ERROR 14.4, исключение MODE_ERROR 14.4, исключение STATUS_ERROR 14.4, максимальная длина строчки 14.3, номер столбца 14.3, номер страницы 14.3, номер строчки 14.3, параметр FORE 8, параметр WIDTH 143.5, 7, 14,3.9, признак конца страницы 14.1, признак конца строчки 14.1, пропуск 9, просмотреть 7, 8, 9, процедура GET 6, 7, 8, 9, процедура NEW_LINE 4, процедура PUT 6, 7, 8, 9, текущий файл по умолчанию 14.3, файл
6. ВВОД-ВЫВОД СИМВОЛОВ И СТРОК
Для элемента типа CHARACTER определены следующие процедуры:
procedure GET(FILE : in FILE_TYPE; ITEM : out CHARACTER); procedure GET(ITEM : out CHARACTER); В заданном файле ввода процедуры пропускают признаки конца строчки и страницы и читают следующий за ними символ; значение этого символа возвращают параметру ITEM вида out.
При попытке пропустить признак конца файла возбуждается исключение END_ERROR.
procedure PUT(FILE : in FILE_TYPE; ITEM : in CHARACTER); procedure PUT(ITEM : in CHARACTER); Если длина строчки заданного файла вывода ограничена (т. е. не равна нулю по соглашению), а текущий номер столбца превышает эту длину, то выполняют действия, эквивалентные вызову процедуры NEW_LINE с параметром SPACING, равным единице. Затем в любом случае в файл выводят заданный символ.
Для элемента типа STRING определены следующие процедуры:
procedure GET(FILE : In FILE_TYPE; ITEM : out STRING); procedure GET(ITEM : out STRING); Определяют длину (число символов) данной строки; затем для последовательных символов строки соответствующее число раз выполняют операцию GET (в частности, для пустой строки никаких действий не выполняют).
procedure PUT(FILE : in FILE_TYPE; ITEM : in STRING); procedure PUT(ITEM : in STRING); Определяют длину (число символов) данной строки; затем для последовательных символов строки соответствующее число раз выполняют операцию PUT (в частности, для пустой строки никаких действий не выполняют).
procedure GET_LINE(FILE : in FILE_TYPE; ITEM : out STRING; LAST : out NATURAL); procedure GET_LINE(ITEM : out STRING; LAST : out NATURAL); Заменяют последовательные символы, содержащиеся в указанной строке, символами, читаемыми из заданного файла. Чтение заканчивается при достижении конца строчки файла;
в этом случае выполняют действия, эквивалентные действиям процедуры SKIP_LINE с пара- метром SPACING, равным единице. Чтение также заканчивается при достижении конца строки, заданной параметром ITEM. Символы, которые не были заменены, остаются неопределенными.
Если символы прочитаны, то в параметр LAST возвращается индекс последнего замененного символа так, что индексированная компонента ITEM (LAST) — это значение последнего замененного символа (индекс первого замененного символа равен атрибуту ITEM'FIRST). Если не было прочитано ни одного символа, то в LAST выдается значение индекса, на единицу меньшее атрибута ITEM'FIRST.
При попытке пропустить признак конца файла возбуждается исключение END_ERROR.
procedure PUT_LINE(FILE : in FILE.TYPE; ITEM : in STRING); procedure PUT_LINE(ITEM : in STRING); Вызывают процедуру PUT для заданной строки, затем процедуру NEW_LINE с параметром SPACING, равным единице.
Примечание. Внешние кавычки строкового литерала, являющегося параметром процедуры PUT, не выводятся. Каждый сдвоенный символ кавычки, приведенный внутри такого литерала, выводится как один символ кавычки; это следует из правил для строковых литералов (см. 2.6).
Строка, считываемая процедурой GET или записываемая процедурой PUT, в файле может занимать несколько строчек.
Ссылки: длина строки 14.3, длина строчки 14.3, 5, исключение END_ERROR 14.4, признак конца страницы 14.3, процедура GET 5, процедура NEW_LINE 4, процедура PUT 4, строчка 14.3, текущий номер столбца 14.3, файл
7. ВВОД-ВЫВОД ДЛЯ ЦЕЛЫХ ТИПОВ
Описанные ниже процедуры определены в настраиваемом пакете INTEGER_IO. Он должен быть конкретизован с соответствующим целым типом (указанным в спецификации параметром настройки NUM).
Значения выводятся в виде десятичных литералов или литералов с основанием, без подчеркиваний и порядка, с предшествующим знаком минус для отрицательных чисел. Формат, определяющий ширину поля (включая ведущие пробелы и знак минус), может быть задан необязательным параметром WIDTH. Его значение принадлежит неотрицательному целому подтипу FIELD. Значения основания принадлежат целому подтипу NUMBER-BASE.
subtype NUMBER_BASE is INTEGER range 2 .. 16; В процедурах вывода могут использоваться ширина поля и основание по умолчанию; они задаются переменными, описанными в настраиваемом пакете INTEGER_IO:
DEFAULT_WIDTH : FIELD := NUM_WIDTH; DEFAULT_BASE : NUMBER_BASE ;= 10; Определены следующие процедуры:
procedure GET(FILE : In FILE_TYPE; ITEM : out NUM; WIDTH : in FIELD := 0); procedure GET(ITEM : out NUM; WIDTH : in FIELD := 0); При нулевом значении параметра WIDTH пропускают все ведущие пропуски, признаки конца строчки и страницы, читают знак плюс или минус (если он есть), затем производят чтение в соответствии с синтаксисом целого литерала (он может быть литералом с основанием). При нулевом значении WIDTH вводят ровно WIDTH символов, или если раньше встретится признак конца строки, то вводят лишь символы до этого признака конца (возможно, ни одного); в это количество включаются и все ведущие пропуски.
В параметр ITEM типа NUM возвращают значение, соответствующее введенной последовательности.
Если введенная последовательность не соответствует правилам синтаксиса или если полученное значение не принадлежит подтипу NUM, то возбуждается исключение DATA_ERROR.
procedure PUT(FILE : in FILE_TYPE; ITEM : in NUM; WIDTH : in FIELD := DEFAULT_WIDTH; BASE : in NUMBER_BASE := DEFAULT_BASE);procedure PUT(ITEM : in NUM; WIDTH : in FIELD := DEFAULT_WIDTH; BASE : in NUMBER_BASE := DEFAULT_BASE); Значение параметра ITEM выводят в виде целого литерала без подчеркиваний, порядка и ведущих нулей (если значение равно нулю, выводят один нуль), с предшествующим знаком минус, если значение отрицательное.
Если число символов выводимой последовательности меньше значения WIDTH, то она дополняется ведущими пробелами.
Если параметр BASE (заданный явно указанным значением или переменной DEFAULT_BASE) имеет значение десять, то числа выводятся по синтаксису десятичного литерала, в противном случае — по синтаксису литерала с основанием и всеми прописными буквами.
procedure GET(FROM : in STRING; ITEM : out NUM; LAST : out POSITIVE); Читает с начала строки, заданной параметром FROM, целое значение по тем же правилам, что и процедура GET, которая читает целое значение из файла; при этом рассматривает конец строки как признак конца файла. Через параметр ITEM возвращает значение типа NUM, соответствующее введенной последовательности. Через параметр LAST возвращает значение индекса, соответствующее последнему читаемому символу (следовательно, этот символ имеет значение индексированной компоненты FROM(LAST)).
Если введенная последовательность не соответствует правилам синтаксиса или если полученное значение не принадлежит подтипу NUM, то возбуждается исключение DATA_ERROR.
procedure PUT(TO : out STRING; ITEM : in NUM; BASE : in NUMBER_BASE := DEFAULT_BASE); Через параметр ТО выводит значение параметра ITEM по тем же правилам, что и при выводе в файл; в качестве значения параметра WIDTH используется длина указанной строки.
десятичный литерал 1, исключение DATA_ERROR
Примечание
package INT_IO is new INTEGER_IO(SMALUNT); use INT_IO; -— в результате конкретизации -— получается формат по умолчанию: —— DEFAULT_WIDTH = 4, DEFAULT_BASE = 10PUT(126); -- "b126" PUT(-126, 7); -- "ЬЬЬ-126" PUT(126, WIDTH => 13, BASE => 2); -- "bbb2#1111110#" Ссылки: десятичный литерал 1, исключение DATA_ERROR 14.4, исключение LAYOUT_ERROR 14.4, литерал с основанием 2, пакет INTEGER_IO 10, параметр WIDTH 5, подтип FIELD 5, признак конца строчки 14.3, пропуск 5, просмотреть 5, процедура GET 5, процедура PUT 5, тип FILE_TYPE 14.1, целый литерал
8. ВВОД-ВЫВОД ДЛЯ ВЕЩЕСТВЕННЫХ ТИПОВ
Следующие процедуры определены в настраиваемых пакетах FLOAT_IO и FIXED_IO, которые должны быть конкретизованы с соответствующим плавающим или фиксированным типом (указанным в спецификации параметром NUM).
Значения выводятся как десятичные литералы без подчеркиваний. Формат каждого выводимого значения состоит из поля FORE, десятичной точки, поля AFT, а также (при ненулевом значении параметра ЕХР) буквы Е и поля ЕХР. Таким образом, возможны два формата:
FORE . AFT и FORE . AFT E ЕХР без всяких пробелов между этими полями. Поле FORE может включать предшествующие пробелы и знак минус для отрицательных значений. Поле AFT состоит из одних лишь десятичных цифр (оно может оканчиваться нулями). Поле ЕХР состоит из знака (плюс или минус) и порядка (возможно, с предшествующими нулями).
Для плавающих типов длины этих полей по умолчанию определены переменными, описанными в пакете FLOAT_IO:
DEFAULT_FORE : FIELD := 2; DEFAULT_APT : FIELD := NUM'DIGITS-1; DEFAULT_EXP : FIELD := 3; Для фиксированных типов длины по умолчанию для этих полей задаются переменными, описанными в пакете FIXED_IO:
DEFAULT_FORE : FIELD := NUM'FORE; DEFAULT_AFT : FIELD := NUM'AFT; DEFAULT_EXP : FIELD := 0; Определены следующие процедуры:
procedure GET(FILE : in FILE_TYPE; ITEM : out NUM; WIDTH : in FIELD := 0); procedure GET(ITEM : out NUM; WIDTH : in FIELD := 0); При нулевом значении параметра WIDTH опускают все ведущие пропуски, признак конца строчки или признак конца страницы, читают знак плюс или минус (если он есть); затем производят чтение в соответствии с синтаксисом вещественного литерала (он может быть литералом с основанием). При ненулевом значении параметра WIDTH вводят или ровно WIDTH символов, или, если раньше встретился признак конца строчки, лишь символы, читаемые до этого признака конца (возможно, ни одного символа); в это количество включаются и все предшествующие пропуски.
Через параметр ITEM возвращают значение типа NUM, соответствующее введенной последовательности.
Если введенная последовательность не удовлетворяет требованиям синтаксиса или если полученное значение не принадлежит подтипу NUM, то возбуждается исключение DATA_ERROR.
procedure PUT(FILE : in FILE_TYPE; ITEM : in NUM; FORE : in FIELD := DEFAULT_FORE; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP);procedure PUT(ITEM : in NUM; FORE : in FIELD := DEFAULT_FORE; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP); Выводят значение параметра ITEM в виде десятичного литерала в формате, определяемом параметрами FORE, AFT и ЕХР. Если значение ITEM отрицательное, то в целую часть включен знак минус. При нулевом значении параметра ЕХР целая часть представляется таким количеством цифр, которое требуется для представления целой части значения ITEM. При необходимости значение FORE игнорируется. Если в значении ITEM нет целой части, то целая часть представляется цифрой 0.
Если значение ЕХР больше нуля, то целая часть представляется одной цифрой, отличной от нуля, за исключением случая, когда значение ITEM равно
В обоих случаях, если целая часть, включая знак минус, содержит менее FORE символов, она дополняется до этого количества ведущими нулями. Дробная часть состоит из AFT цифр или при AFT, равном нулю, из одной цифры. Значение округляется; остаток, равный половине последнего разряда, может быть округлен как с избытком, так и с недостатком.
При нулевом значении ЕХР число выводится без порядка. Если ЕХР больше нуля, то при . выводе порядка выводится столько цифр, сколько необходимо для представления порядка значения ITEM (для представления целой части этого значения используется один символ);первым символом является знак плюс или минус. Если для представления порядка, включая знак, используется менее ЕХР символов, то это представление дополняется до требуемого количества символов ведущими нулями. Для значения ITEM, равного 0.0, порядок равен нулю.
procedure GET(FROM : in STRING; ITEM : out NUM; LAST : out POSITIVE); Читает с начала строки, заданной параметром FROM, вещественное значение по тем же правилам, что и процедура GET, читающая вещественное значение из файла; при этом конец строки рассматривается как признак конца файла. Через параметр ITEM возвращает значение типа NUM, соответствующее введенной последовательности. Через параметр LAST возвращает значение индекса, соответствующее последнему читаемому символу (следовательно, этот символ имеет значение индексируемой компоненты FROM (LAST)).
Если введенная последовательность не соответствует правилам синтаксиса или если полученное значение не принадлежит подтипу NUM, то возбуждает исключение DATA_ERROR.
procedure PUT(TO : out STRING; ITEM : in NUM; AFT : in FIELD := DEFAULT_AFT; EXP : in INTEGER := DEFAULT_EXP); Через параметр ТО выводит значение параметра ITEM по тем же правилам, что и при выводе в файл; при этом в качестве FORE использует такое значение, чтобы общее число выводимых символов, включая предшествующие пробелы, соответствовало длине строки параметра ТО.
получается формат по умолчанию: DEFAULTEXP
Примечание
package REAL_IO is new FLOAT_IO(REAL); use REAL_IO; -- в "результате конкретизации -- получается формат по умолчанию: DEFAULTEXP = 3 X : REAL :=-123.4567; -— 8 цифр (СМ. 7)PUT(X); --формат по умолчанию "-1.2345670Е+02" PUT(X, FORE => 5, AFT => 3, ЕХР => 2); -- "ЬЬЬ-1.235Е+2" PUT(X, 5, 3, 0); -- "Ь-123.457" Примечание. Если положительное число, выводимое процедурой PUT в строку, заполняет строку целиком, без использования ведущих пробелов, то при выводе такого же отрицательного числа будет возбуждено исключение LAYOUT_ERROR.
Ссылки: атрибут AFT 10, атрибут FORE 10, вещественный литерал 2.4, десятичный литерал 1, признак конца строчки 5, исключение DATA_ERROR 14.4, исключение LAYOUT_ERROR 14.4, литерал с основанием 2, пакет FIXED_IO 10, пакет FLOAT_IO 10, параметр WIDTH 5, подтип FIELD 5, пропуск 5, просмотреть 5, процедура GET 5, процедура PUT 5, тип FILE_TYPE
9. ВВОД-ВЫВОД ДЛЯ ПЕРЕЧИСЛИМЫХ ТИПОВ
Описанные ниже процедуры определены в настраиваемом пакете ENUMERATION_IO, который должен быть конкретизован с соответствующим перечислимым типом (указанным в спецификации параметром настройки ENUM).
При выводе значений для представления идентификаторов используются либо строчные, либо прописные буквы. Это задается параметром SET, который принадлежит перечислимому типу TYPE-SET:
type TYPE_SET is (LOWER_CASE, UPPER_CASE); Формат (в который включаются и заключительные пробелы) может быть задан необязательным параметром ширины поля. Ширина поля по умолчанию и представление букв задаются описанными в настраиваемом пакете ENUMERATION_IO переменными:
DEFAULT_WIDTH : FIELD := 0; DEFAULT_SETTING : TYPE_SET := UPPER_CASE; Определены следующие процедуры:
procedure GET(FILE : in FILE_TYPE; ITEM : out ENUM); procedure GET(ITEM : out ENUM); После игнорирования предшествующих пропусков, признака конца строчки и признака конца страницы читают или идентификатор (строчные и прописные буквы считаются эквивалентными), или символьный литерал (включая апострофы); чтение производится в соответствии с синтаксисом соответствующих лексем. Через параметр ITEM возвращают значение, соответствующее введенной последовательности.
Если введенная последовательность не удовлетворяет правилам синтаксиса или если идентификатор или символьный литерал не соответствуют никакому значению подтипа ENUM, то возбуждается исключение DATA_ERROR.
procedure PUT(FILE : in FILE_TYPE; ITEM : in ENUM; WIDTH : in FIELD := DEFAULT_WIDTH; SET : in TYPE_SET := DEFAULT_SETTING);procedure PUT(ITEM :in ENUM; WIDTH : in FIELD := DEFAULT_WIDTH; SET : in TYPE_SET := DEFAULT_SETTING); Выводят значение параметра ITEM как литерал перечисления (либо идентификатор, либо символьный литерал). Необязательный параметр SET указывает, какие буквы — строчные или прописные — следует использовать для представления идентификаторов (для символьных литералов он игнорируется). Если число выводимых символов меньше значения параметра WIDTH, то после них выводятся пробелы, дополняющие число символов до WIDTH.
procedure GET(FROM : in STRING; ITEM : out ENUM; LAST : out POSITIVE); Читает с начала строки, заданной параметром FROM, значение перечислимого типа по тем же правилам, что и процедура GET, читающая значение перечислимого типа из файла;при этом конец строки рассматривается как признак конца файла. Через параметр ITEM возвращает значение типа ENUM, соответствующее введенной последовательности. Через параметр LAST возвращает значение индекса, соответствующее последнему читаемому символу (следовательно, этот символ имеет значение индексируемой компоненты FROM (LAST)).
Если введенная последовательность не соответствует правилам синтаксиса или если идентификатор или символьный литерал не соответствуют никакому значению подтипа ENUM, то возбуждает исключение DATA_ERROR.
procedure PUT(TO : out STRING; ITEM : in ENUM; SET : in TYPE_SET := DEFAULT_SETTING); Выводит в строку, заданную параметром ТО, значение параметра ITEM по тем же правилам, что и при выводе в файл; в качестве значения параметра WIDTH используется длина указанной строки.
Хотя спецификация пакета ENUMERATION_IO допускает конкретизацию с соответствующим целым типом, это не является целью данного пакета; язык не определяет результата такой конкретизации.
Примечание. Процедуры PUT для символов и для перечислимых значений имеют определенные различия:
TEXT_IO.PUT('A'); -— выводит символ Аpackage CHAR_IO is new TEXT_IO.ENUMERATION_IO(CHARACTER); CHAR_IO.PUT('A'); -— выводит символ 'А', заключенный в одинарные кавычки Тип BOOLEAN является перечислимым типом, поэтому пакет ENUMERATION_IO может быть настроен на этот тип.
Ссылки: исключение DATA_ERROR 14.4, пакет ENUMERATION_IO 10, параметр WIDTH 5, подтип FIELD 5, признак конца строчки 5, пропуск 5, просмотреть 5, процедура GET 5, процедура PUT 5, тип FILE_TYPE
10. СПЕЦИФИКАЦИЯ ПАКЕТА ВВОДА-ВЫВОДА ТЕКСТА
with IO_EXCEPTIONS; package TEXT_IO is type FILE_TYPE is limited private; type FILE_MODE is (IN_FILE, OUT_FILE); type COUNT is range 0 .. определяется_реапизацией; subtype POSITIVE_COUNT is COUNT range 1 .. COUNT'LAST; UNBOUNDED : constant COUNT := 0; -- длина строчки и страницы subtype FIELD is INTEGER range 0 .. определяется_реапизацией; subtype NUMBER_BASE is INTEGER range 2 .. 16; type TYPE_SET is (LOWER_CASE, UPPER_CASE); -- управление файлами 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 SET_INPUT (FILE : in FILE_TYPE); procedure SET_OUTPUT(FILE : in FILE_TYPE); function STANDARD_INPUT return FILE_TYPE; function STANDARD_OUTPUT return FILE_TYPE; function CURRENT_INPUT return FILE_TYPE; function CURRENT_OUTPUT return FILE_TYPE; -- спецификация длин строчки и страницы procedure SET_LINE_LENGTH(FILE : in FILE_TYPE; TO : in COUNT); procedure SET_LINE_LENGTH(TO : in COUNT); procedure SET_PAGE_LENGTH(FILE : in FILE_TYPE; TO : in COUNT); procedure SET_PAGE_LENGTH(TO : in COUNT); function LINE_LENGTH(FILE : in FILE_TYPE) return COUNT; function LINE_LENGTH return COUNT; function PAGE_LENGTH(FILE : in FILE_TYPE) return COUNT; function PAGE_LENGTH return COUNT; -- управление колонкой, строчкой и страницей procedure NEW_LINE (FILE : in FILE_TYPE; SPACING : in POSITIVE_COUNT := 1); procedure NEW_LINE (SPACING : in POSITIVE_COUNT := 1); procedure SKIP_LINE (FILE : in FILE_TYPE; SPACING : in POSITIVE_COUNT := 1); procedure SKIP_LINE (SPACING : in POSITIVE_COUNT := 1); function END_OF_LINE(FILE : in FILE_TYPE) return BOOLEAN; function END_OF_LINE return BOOLEAN; procedure NEW_PAGE (FILE : in FILE_TYPE); procedure NEW_PAGE; procedure SKIP_PAGE (FILE : in FILE_TYPE); procedure SKIP_PAGE; function END_OF_PAGE(FILE : in FILE_TYPE) return BOOLEAN; function END_OF_PAGE return BOOLEAN; function END_OF_FILE(FILE : in FILE_TYPE) return BOOLEAN; function END_OF_FILE return BOOLEAN; procedure SET_COL (FILE : in FILE_TYPE; TO : in POSITIVE_COUNT); procedure SET_COL (TO : in POSITIVE_COUNT); procedure SET_LINE(FILE : in FILE_TYPE; TO : in POSITIVE_COUNT); procedure SET_LINE(TO : in POSITIVE_COUNT); function COL (FILE : in FILE_TYPE) return POSITIVE_COUNT; function COL return POSITIVE_COUNT; function LINE(FILE : in FILE_TYPE) return POSITIVE_COUNT; function LINE return POSITIVE_COUNT; function PAGE(FILE : in FILE_TYPE) return POSITIVE_COUNT; function PAGE return POSITIVE_COUNT; -- символьный ввод-вывод procedure GET(FILE : in FILE_TYPE; ITEM : out CHARACTER); procedure GET(ITEM : out CHARACTER); procedure PUT(FILE : in FILE_TYPE; ITEM : in CHARACTER); procedure PUT(ITEM : in CHARACTER); -- строковый ввод-вывод procedure GET(FILE : in FILE_TYPE; ITEM : out STRING); procedure GET(ITEM : out STRING); procedure PUT(FILE : in FILE_TYPE; ITEM : in STRING); procedure PUT(ITEM : in STRING); procedure GET_LINE(FILE : in FILE_TYPE; ITEM : out STRING; LAST : out NATURAL); procedure GET_LINE(ITEM : out STRING; LAST : out NATURAL); procedure PUT_LINE(FILE : in FILE_TYPE; ITEM : in STRING); procedure PUT_LINE(ITEM : in STRING); -- настраиваемый пакет для ввода-вывода целых типов generic type NUM is range <>; package INTEGER_IO is DEFAULT_WIDTH : FIELD := NUM'WIDTH; DEFAULT_BASE : NUMBER_BASE := 10; procedure GET(FILE : in FILE_TYPE; ITEM : out NUM; WIDTH : in FIELD := 0); procedure GET(ITEM : out NUM; WIDTH : in FIELD := 0); procedure PUT(FILE : in FILE_TYPE; ITEM : in NUM; WIDTH : in FIELD := DEFAULT_WIDTH; BASE : in NUMBER_BASE := DEFAULT_BASE); procedure PUT(ITEM : in NUM; WIDTH : in FIELD := DEFAULT_WIDTH; BASE : in NUMBER_BASE := DEFAULT_BASE); procedure GET(FROM : in STRING; ITEM : out NUM; LAST : out POSITIVE); procedure PUT(TO : out STRING; ITEM : in NUM; BASE : in NUMBER_BASE := DEFAULT_BASE); end INTEGER_IO; -- настраиваемый пакет для ввода-вывода вещественных типов generic type NUM is digits <>; package FLOAT_IO is DEFAULT_FORE : FIELD := 2; DEFAULT_AFT : FIELD := NUM'DIGITS-1; DEFAULT_EXP : FIELD := 3; procedure GET(FILE : in FILE_TYPE; ITEM : out NUM; WIDTH : in FIELD := 0); procedure GET(ITEM : out NUM; WIDTH : in FIELD := 0); procedure PUT(FILE : in FILE_TYPE; ITEM : in NUM; FORE : in FIELD := DEFAULT_FORE; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP); procedure PUT(ITEM : in NUM; FORE : in FIELD := DEFAULT_FORE; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP); procedure GET(FROM : in STRING; ITEM : out NUM; LAST : out POSITIVE); procedure PUT(TO : out STRING; ITEM : in NUM; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP); end FLOAT_IO; generic type NUM is delta <>; package FIXED_IO is DEFAULT_FORE : FIELD := NUM'FORE; DEFAULT_AFT : FIELD := NUM'AFT; DEFAULT_EXP : FIELD := 0; procedure GET(FILE : in FILE_TYPE; ITEM : out NUM; WIDTH : in FIELD := 0); procedure GET(ITEM : out NUM; WIDTH : in FIELD := 0); procedure PUT(FILE : in FILE_TYPE; ITEM : in NUM; FORE : in FIELD := DEFAULT_FORE; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP); procedure PUT(ITEM : in NUM; FORE : in FIELD := DEFAULT_FORE; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP); procedure GET(FROM : in STRING; ITEM : out NUM; LAST : out POSITIVE); procedure PUT(TO : out STRING; ITEM : in NUM; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP); end FIXED_IO; -- настраиваемый пакет для ввода-вывода перечислимых типов generic type ENUM is (<>); package ENUMERATION_IO is DEFAULT_WIDTH : FIELD := 0; DEFAULT_SETTING : TYPE_SET := UPPER_CASE; procedure GET(FILE : in FILE_TYPE; ITEM : out ENUM); procedure GET(ITEM : out ENUM); procedure PUT(FILE : in FILE_TYPE; ITEM : in ENUM; WIDTH : in FIELD := DEFAULT_WIDTH; SET : in TYPE_SET := DEFAULT_SETTING); procedure PUT(ITEM : in ENUM; WIDTH : in FIELD := DEFAULT_WIDTH; SET : in TYPE_SET := DEFAULT_SETTING); procedure GET(FROM : in STRING; ITEM : out ENUM; LAST : out POSITIVE); procedure PUT(TO : out STRING; ITEM : in ENUM; SET : in TYPE_SET := DEFAULT_SETTING); end ENUMERATION_IO; -- исключения 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; LAYOUT_ERROR : exception renames IO_EXCEPTIONS.LAYOUT_ERROR; private -- определяется реализацией end TEXT_IO;
Пример ввода-вывода
В примере показано использование некоторых средств ввода-вывода текстов в режиме диалога. Пользователю предлагается выбрать цвет; программа в соответствии с описью выдает число предметов этого цвета на складе. Используются файлы ввода и вывода по умолчанию. Для простоты все необходимые конкретизации настройки заданы в одной подпрограмме;на практике для этого мог бы использоваться самостоятельный пакет.
with TEXT_IO; use TEXT_IO; procedure DIALOGUE is type COLOR is (WHITE, RED, ORANGE, YELLOW, GREEN, BLUE, BROWN); package COLOR_IO is new ENUMERATION_10(ENUM => COLOR); package NUMBER_IO is new INTEGER_IO(INTEGER); use COLOR_IO, NUMBER_IO; INVENTORY : array (COLOR) of INTEGER := (20, 17, 43, 10, 28, 173, 87); CHOICE : COLOR; procedure ENTER_COLOR (SELECTION : out COLOR) is begin loop begin PUT ("Color selected: "); -— обращение к пользователю GET (SELECTION); -— вводит набранный цвет или возбуждает исключение return; exception when DATA_ERROR => PUT("lnvalid color, try again. ");-- пользователь должен набрать новую строчку NEW_LINE(2); -- завершение выполнения оператора блока end; end loop; -— повторение оператора блока, пока не будет получен правильнй цвет end;begin -- операторы процедуры DIALOGUE; NUMBERJO.DEFAULT_WIDTH := 5; loop ENTER_COLOR(CHOICE); -- пользователь набирает цвет и -— начинает новую строчку SET_COL(5); PUT(CHOICE); PUT(" items available:"); SET_COL(40); PUT(INVENTORY(CHOICE)); -— ширина по умолчанию равна 5 NEW_LINE; end loop; end DIALOGUE;Пример диалога (набранное пользователем выделено курсивом):
ВЫБРАННЫЙ ЦВЕТ: Black ОШИБОЧНЫЙ ЦВЕТ, ПОВТОРИТЕ НАБОРВЫБРАННЫЙ ЦВЕТ: Blue BLUE ВСЕГО ПРЕДМЕТОВ: 173 ВЫБРАННЫЙ ЦВЕТ: Yellow YELLOW ВСЕГО ПРЕДМЕТОВ: 10Спецификация пакета исключений ввода-вывода
В этом пакете определены исключения, необходимые для работы пакетов SEQUENTIAL_IO, DIRECT_IO и TEXT_IO.
package IO_EXCEPTIONS is STATUS_ERROR : exception; MODE_ERROR : exception; NAME_ERROR : exception; USE_ERROR : exception; DEVICE_ERROR : exception; END_ERROR : exception; DATA_ERROR : exception; LAYOUT_ERROR : exception; end IO_EXCEPTIONS;Внешние файлы и файловые объекты
Значения, вводимые из внешнего для программы окружения или выводимые в это окружение, размещаются во внешних файлах. Внешним файлом может быть нечто внешнее по отношению к программе, которая может произвести читаемое значение или получить записываемое. Внешний файл идентифицируется строкой {именем). Вторая строка (форма) задает дополнительные системно-зависимые характеристики, которые могут быть сопоставлены с файлом, например физическая организация или права доступа. Соглашения об интерпретации таких строк должны быть приведены в приложении F.
Операции ввода и вывода выражены операциями над объектами некоторого файлового типа, а не непосредственно в терминах внешних файлов. Далее в этой главе термин файл будет всегда использоваться для ссылки на объект файлового типа; в остальных случаях будет использоваться термин внешний файл. Значения, передаваемые данному файлу, должны быть все одного и того же типа.
Ввод и вывод для последовательных файлов из элементов некоторого типа определены настраиваемым пакетом SEQUENTIAL_IO. Общая структура этого пакета дана ниже.
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 OPEN (FILE : in out FILE_TYPE; ...); ... procedure READ (FILE : in FILE_TYPE; ITEM : out ELEMENT_TYPE); procedure WRITE (FILE : in FILE_TYPE; ITEM : in ELEMENT_TYPE); ... end SEQUENTIAL_IO;Для определения последовательного ввода-вывода элементов данного типа должна быть описана конкретизация этого настраиваемого модуля с фактическим параметром данного типа. Конкретизация настройки содержит описание файлового типа (названного FILE_TYPE) для файлов таких элементов, а также операции над этими файлами — например, процедуры OPEN, READ и WRITE.
Ввод-вывод для файлов прямого доступа определен аналогичным способом в настраиваемом пакете DIRECT_IO. Ввод-вывод в текстовой форме определен в (ненастраиваемом) пакете TEXT_IO.
До выполнения ввода или вывода как операции над файлом должна быть установлена связь файла с внешним файлом. Когда такая связь установлена, файл называется открытым, в противном случае — закрытым.
В языке не определено, что происходит с внешними файлами после завершения работы главной программы (в частности, если соответствующие файлы не были закрыты). Результат выполнения ввода-вывода над ссылочными типами зависит от реализации.
Открытый файл имеет текущий вид, который является значением одного из перечисленных типов: ,,
type FILE_MODE is (IN_FILE, INOUT_FILE, OUT_FILE); -— ДЛЯ DIRECT_IO type FILE_MODE is (IN_FILE, OUT.FILE); -— ДЛЯ SEQUENTIAL_IO И TEXT_IOЭти значения соответствуют случаям, когда можно осуществить либо только чтение, либо чтение и запись, либо только запись. Вид файла может быть изменен.
Некоторые из операций управления файлами являются общими для всех трех пакетов ввода-вывода. Эти операции над последовательными файлами и файлами прямого доступа описаны в разд. 1. Дополнительные особенности ввода-вывода текстов описаны в разд. 1.
В пакете IO_EXCEPTIONS определены все исключения, которые могут быть возбуждены при вызове подпрограммы ввода-вывода; ситуации их возбуждения описаны либо при описании подпрограмм ввода и вывода (и в разд. 14.4), либо в приложении F для ошибочных ситуаций, зависящих от реализации.
Примечание. Каждая конкретизация настраиваемых пакетов SEQUENTIAL_IO и DIRECT_IO задает разные типы FILE_TYPE; уникальным является тип FILE_TYPE в пакете TEXT_IO.
Устройство с двусторонней связью часто может быть промоделировано двумя файлами с последовательным доступом, связанными с этим устройством; один — вида IN_FILE, а другой — вида OUT_FILE. Реализация может ограничить число файлов, которые могут быть связаны с данным внешним файлом. В этом случае результат такого разделения внешнего файла несколькими объектами файлового типа зависит от реализации.
Ссылки: вид файла 3, индекс 14.2, исключение 11, конкретизация настройки 12.3, открытый файл 14.1, пакет DIRECT_IO 14.1, 14.2, пакет EXCEPTIONS 14.5, пакет SEQUENTIAL_IO 14.2, 2, пакет TEXT_IO 14.3, перечислимый тип 1, последовательный ввод-вывод 2, последовательный доступ 14.2, процедура CREATE 1, процедура DELETE 1, процедура OPEN 1, процедура READ 4, процедура WRITE 4, процедура для файлов прямого доступа 14.2, прямой доступ 14.2, строка 3, текущий индекс 14.2, текущий размер 14, файл ' последовательного доступа
Ввод-вывод низкого уровня
Операция ввода-вывода низкого уровня — это операция, выполняющаяся на физическом устройстве. Для выполнения таких операций используется одна из (совмещенных) предопределенных процедур SEND_CONTROL и RECEIVE_CONTROL
Процедура SEND_CONTROL может быть использована для посылки управляющей информации физическому устройству. Процедура RECEIVE_CONTROL может быть использована для организации выполнения операции ввода-вывода, связанной с запросом информации от физического устройства.
Эти процедуры описаны в стандартном пакете LOW_LEVEL_IO. Каждая из них имеет два параметра, задающие устройство и данные. Однако сорт и формат управляющей информации зависят от физических характеристик машины и устройств; поэтому типы параметров зависят от реализации. Возможно определение совмещенных подпрограмм, управляющих различными устройствами.
Видимый раздел пакета, определяющего такие процедуры, имеет следующую структуру:
package LOW_LEVEL_IO is -- описания возможных типов параметров DEVICE и DATA -- описания совмещенных процедур над такими типами; procedure SEND_CONTROL (DEVICE : тип-устройства; DATA : in out тип-данных); procedure RECEIVE_CONTROL (DEVICE : тип-устройства; DATA : in out тип-данных}; end;Тела процедур SEND_CONTROL и RECEIVE_CONTROL для различных устройств могут быть размещены в теле пакета LOW_LEVEL_IO. Эти тела процедур могут быть записаны операторами кода.
Ввод-вывод текстов
В этом разделе описывается пакет TEXT_IO, который обеспечивает возможности ввода и вывода в удобной для читателя форме. Каждый файл читается или записывается последовательно посимвольно, символы последовательно группируются в строчки, последовательность строчек — в страницы. В разд. 10 приведена спецификация этого пакета.
Возможности управления файлами, описанные в разд. 1 и 2, применимы и для текстового ввода-вывода. Однако вместо процедур READ и WRITE используются процедуры GET и PUT, которые осуществляют ввод и вывод значений соответствующих типов для текстовых файлов. Эти значения передаются процедурами PUT и возвращаются процедурами GET через параметр ITEM. Существует несколько совмещенных процедур с такими именами, но с
различными типами параметра ITEM. Процедуры GET анализируют вводимые последовательности символов как лексемы (см. гл. 2) и возвращают соответствующие значения; процедуры PUT выводят данные значения в виде соответствующих лексем. Процедуры GET и PUT могут также вводить и выводить отдельные символы, рассматриваемые не как лексемы, а как значения символьного типа.
Для числового и перечислимого типов параметра ITEM помимо процедур PUT и GET, записывающих в текстовой файл или читающих из него, существуют аналогичные процедуры с параметром типа STRING. Эти процедуры производят точно такие же анализ и формирование последовательности символов, как и подобные им процедуры с файловым параметром.
Для всех процедур GET и PUT, оперирующих над текстовыми файлами, а также для многих других подпрограмм существуют формы как с параметром файлового типа, так и без него. Каждая процедура GET оперирует над файлом ввода; каждая процедура PUT — над файлом вывода. Если файл не задан, то работа производится над файлом ввода по умолчанию или над файлом вывода по умолчанию.
В начале выполнения программы файлами ввода и вывода по умолчанию являются так называемые стандартный файл ввода и стандартный файл вывода. Эти файлы всегда открыты и имеют текущие виды IN_FILE и OUT_FILE соответственно, они связаны с двумя определяемыми реализацией внешними файлами. Существуют процедуры для замены текущего файла ввода по умолчанию и текущего файла вывода по умолчанию.
Логически текстовой файл представляет собой последовательность страниц, страница — последовательность строчек, а строчка — последовательность символов; конец строчки помечается признаком конца строчки; конец страницы помечается комбинацией признака конца строчки, за которым непосредственно следует признак конца страницы; конец файла помечается комбинацией следующих непосредственно друг за другом признака конца строчки, признака конца страницы и признака конца файла. Признаки конца генерируются во время вывода; либо при вызове специально предусмотренных для этого процедур, либо неявно — как составная часть других операций, например когда для файла заданы ограничения длины строчки, длины страницы или оба этих ограничения.
Язык не определяет, что фактически представляют из себя признаки конца; это зависит от реализации, хотя некоторые из описанных ниже процедур могут опознавать или сами генерировать признаки конца, которые не обязаны всегда быть реализованы именно как символы или последовательности символов. Пользователю безразлично, представлены ли в данной конкретной реализации признаки конца как символы (и если да, то какие именно), так как он никогда явно не вводит и явно не выводит управляющие символы. Язык не определяет результата ввода или вывода управляющих символов (кроме символа горизонтальной табуляции).
Символы строчки пронумерованы начиная с единицы; номер символа называется номером столбца. Для признака конца строчки также определен номер столбца; его значение на единицу больше числа символов в строчке. Строчки страницы и страницы файла пронумерованы аналогично. Текущий номер столбца — это номер следующего (передаваемого) символа или признака конца строчки. Текущий номер строчки — это номер текущей строчки в текущей странице. Текущий номер страницы — это номер текущей страницы в файле. Все эти номера являются значениями подтипа POSITIVE_COUNT типа COUNT (нулевое значение типа COUNT по соглашению используется для специальных целей).
type COUNT is range 0.. определяется-реализацией; subtype POSITIVE_COUNT is COUNT range 1 .. COUNT'LAST;Для файла вывода могут быть заданы максимальная длина строчки и максимальная длина страницы. Если они заданы, а значение не помещается на текущей строчке, то автоматически до вывода значения будет начата новая строчка; если далее эта новая строчка не может быть размещена на текущей странице, то автоматически до вывода будет начата новая страница. Имеются функции для определения максимальной длины строчки и максимальной длины страницы. После открытия файла вида OUT_FILE оба этих значения равны нулю; это значит, что длина страницы и длина строчки считаются неограниченными. (Следовательно, весь файл вывода состоит из одной строчки, если только не используются подпрограммы явного управления структурой строчек и страниц файла.) Для этих целей служит константа UNBOUNDED.
Ссылки: вид OUT_FILE 14.1, вид IN_FILE 14.1, внешний файл 14.1, последовательный доступ 14.1, процедура GET 5, процедура PUT 5, стандартный файл ввода 2, стандартный файл вывода 2, текущий файл по умолчанию 2, тип COUNT 10, файл 14.1, читать 2.
1. УПРАВЛЕНИЕ ФАЙЛАМИ
Для текстовых файлов допустимы только виды IN_FILE и OUT_FILE. К ним также применимы приведенные в разд. 1 подпрограммы управления внешними файлами и приведенная в разд. 2 функция END-OF_FILE для последовательного ввода-вывода. Имеется также вариант функции END-OF_FILE, который выдает результат для текущего файла ввода по умолчанию. Указанные процедуры для текстовых файлов характеризуются следующим:
•Процедуры CREATE и OPEN: после открытия файла вида OUT_FILE длина страницы и длина строчки не ограничены (имеют по соглашению значение 0). После открытия файла вида IN_FILE или OUT_FILE текущие номера столбца, строчки и страницы устанавливаются равными единице.
•Процедура CLOSE: если файл имеет текущий вид OUT_FILE, а текущая страница еще не завершена, то результат эквивалентен вызову подпрограммы NEW-PAGE; затем выводится признак конца файла.
•Процедура RESET: если файл имеет текущий вид OUT_FILE, а текущая страница еще не завершена, то результат эквивалентен вызову подпрограммы NEW-PAGE; затем выводится признак конца файла. Если новый вид файла — OUT_FILE, то длина строчки и длина страницы становятся неограниченными. Для всех видов файла текущие номера столбца, строчки и страницы устанавливаются равными единице.
При попытке изменить вид текущего файла ввода по умолчанию или текущего файла вывода по умолчанию процедура RESET возбуждает исключение MODE_ERROR.
Ссылки: вид файла 14.1, вид IN_FILE 14.1, вид OUT_FILE 14.1, внешний файл 14.1, длина страницы 14.3, длина строчки 14.3, исключение MODE_ERROR 14.4, признак конца файла 14.3, процедура CREATE 1, процедура OPEN 1, процедура RESET 1, текущий номер столбца 14.3, текущий номер страницы 14.3, текущий номер строчки 14.3, текущий файл ввода по умолчанию 14.3, файл 14.1, функция END-OF_FILE 4,
2. ФАЙЛЫ ВВОДА И ВЫВОДА ПО УМОЛЧАНИЮ
Следующие подпрограммы служат для управления файлами по умолчанию, используемыми при отсутствии параметра-файла в процедурах PUT, GET или в других описанных ниже операциях текстового ввода-вывода.
procedure SET_INPUT(FILE : in FILE.TYPE);Оперирует над файлом вида IN_FILE. Устанавливает текущим файлом ввода по умолчанию файл, заданный параметром FILE.
Если данный файл не открыт, то возбуждается исключение STATUS_ERROR. Если вид данного файла отличен от IN_FILE, то возбуждается исключение MODE_ERROR.
procedure SET_OUTPUT(FILE : in FILE_TYPE);Оперирует над файлом вида OUT_FILE. Устанавливает текущим файлом вывода по умолчанию файл, заданный параметром FILE.
Если данный файл не открыт, то возбуждается исключение STATUS_ERROR. Если вид данного файла отличен от OUT_FILE, то возбуждается исключение MODE_ERROR.
function STANDARD_INPUT return FILE_TYPE;Возвращает стандартный файл ввода (см. 14.3).
function STANDARD_OUTPUT return FILE_7YPE;Возвращает стандартный файл вывода (см. 14.3).
function CURRENT_INPUT return FILE_TYPE;Возвращает текущий файл ввода по умолчанию.
function CURRENT_OUTPUT return FILE_TYPE;Возвращает текущий файл вывода по умолчанию.
Примечание. Стандартные файлы ввода и вывода не могут быть открыты, закрыты, переустановлены и уничтожены, потому что в соответствующих процедурах параметр FILE имеет вид In out.
Ссылки: исключение MODE_ERROR 14.4, исключение STATUS_ERROR 14.4, процедура GET 5, процедура PUT 5, текущий файл по умолчанию 14.3, тип FILE_TYPE 14.1, файл по умолчанию
3. СПЕЦИФИКАЦИИ ДЛИН СТРОЧЕК И СТРАНИЦ
Описанные в этом разделе подпрограммы связаны со структурой строчек и страниц файла вида OUT_FILE. Они оперируют либо над файлом, заданным первым параметром, либо при отсутствии такого параметра над текущим файлом вывода по умолчанию. Эти подпрограммы служат для вывода текста с заданными максимальными длинами строчки или страницы. В этих случаях признаки конца строчки и страницы выводятся неявно и автоматически, по мере необходимости. Когда длины строчки и страницы не ограничены (т.е. когда они имеют по соглашению значение нуль), как в случае заново открытого файла, новые строчки или страницы можно начать лишь в результате явного вызова соответствующих подпрограмм.
Во всех случаях, если заданный файл не открыт, то возбуждается исключение STATUS_ERROR; если вид этого файла отличен от OUT_FILE, то возбуждается исключение MODE_ERROR.
procedure SET_LINE_LENGTH(FILE : in FILE_TYPE; TO : in COUNT); procedure SET_LINE_LENGTH(TO : in COUNT);Устанавливает максимальную длину строчки заданного файла вывода равной числу символов, задаваемому значением параметра ТО. Нулевое значение параметра ТО задает неограниченную длину строчки.
Если заданное значение длины строчки не подходит для связанного с ней внешнего файла, то возбуждается исключение USE_ERROR.
procedure SET_PAGE_LENGTH <FILE : in FILE.7YPE; TO : in COUNT); procedure SET_PAGE_LENGTH (TO : in COUNT);Устанавливает максимальную длину страницы заданного файла вывода равной числу строчек, задаваемому значением параметра ТО. Нулевое значение параметра ТО задает неограниченную длину страницы.
Если данное значение длины страницы не подходит для связанного с данным внешним файлом, то возбуждается исключение USE_ERROR.
function LINE_LENGTH(FILE : in FILE_TYPE) return COUNT; function LINE_LENGTH return COUNT;Возвращает максимальную длину строчки, установленную для заданного файла вывода, или нуль, если длина строчки не ограничена.
function PAGE_LENGTH(FILE : in FILE_JYPE) return COUNT; function PAGE_LENGTH return COUNT;Возвращает максимальную длину страницы, установленную для данного файла, или нуль, если длина страницы не ограничена.
Ссылки: вид OUT_FILE 1, внешний файл 14.1, длина страницы 14.3, длина строчки 14.3, исключение MODE_ERROR 14.4, исключение STATUS_ERROR 14.4, исключение USE_ERROR 14.4, максимальная длина страницы 14.3, максимальная длина строчки 14.3, неограниченная длина страницы 14.3, открытый файл 14.1, признак конца строчки 14.3, страница 14.3, строчка 14.3, текущий файл вывода по умолчанию 14.3, тип COUNT 14.3, тип FILE_TYPE 14.1, файл
4. ОПЕРАЦИИ НАД СТОЛБЦАМИ, СТРОЧКАМИ И СТРАНИЦАМИ
Описанные в этом разделе подпрограммы предназначены для явного управления структурой строчек и страниц файла; они оперируют либо над файлом, заданным первым параметром, либо при отсутствии такого параметра-файла над текущим файлом (ввода или вывода) по умолчанию. Если используемый в этих подпрограммах файл не открыт, то возбуждается исключение STATUS_ERROR.
procedure SKIP_LINE(FILE : in FILE_TYPE; SPACING : in POSITIVE_COUNT := 1); procedure SKIP_LINE(SPACING : in POSITIVE_COUNT := 1);Оперирует над файлом вида OUT_FILE.
Если SPACING равно единице, то выводит признак конца строчки, а текущий номер столбца устанавливается равным единице. Затем увеличивает текущий номер строчки на единицу, кроме случая, когда текущий номер строчки уже был равен или превышал максимальную длину страницы; в этом случае сначала выводит признак конца страницы, затем увеличивает текущий номер страницы на единицу, а текущий номер строчки устанавливает равным единице.
Если SPACING больше единицы, то указанные действия повторяются SPACING раз.
Если вид файла не OUT_FILE, то возбуждается исключение MODE_ERROR.
procedure NEW_LINE(FILE : in FILE_TYPE; SPACING : in POSITIVE_COUNT := 1); procedure NEW_LINE(SPACING : in POSITIVE_COUNT := 1);Оперирует над файлом вида IN_FILE.
Если SPACING равен единице, то считывает из файла и пропускает (игнорирует) все символы до признака конца строчки, а текущий номер столбца устанавливает равным единице. Если непосредственно за признаком конца строчки не следует признак конца страницы, то увеличивает текущий номер строчки на единицу. В противном случае, когда за признаком конца строчки непосредственно следует признак конца страницы, пропускает признак конца страницы, увеличивает текущий номер страницы на единицу, а текущий номер строчки устанавливает равным единице.
Если SPACING больше единицы, указанные действия повторяются SPACING раз.
Если вид файла не IN_FILE, то возбуждается исключение MODE_ERROR. При попытке прочитать признак конца файла возбуждается исключение END_ERROR.
function END_OF_LINE(FILE : in FILE_TYPE) return BOOLEAN; function END_OF_LINE return BOOLEAN;Оперирует над файлом вида IN_FILE. Возвращает значение TRUE, если текущий элемент файла — это признак конца строчки или признак конца файла; в противном случае возвращает значение FALSE.
Если вид файла не IN_FILE, то возбуждается исключение MODE_ERROR.
procedure NEW_PAGE(FILE : in FILE_TYPE); procedure NEW_PAGE;Оперирует над файлом вида OUT_FILE. Если текущая строчка не завершена или текущая страница пустая (т.е. текущие номера строчки или столбца оба равны единице), то выводит признак конца строчки. Затем выводит признак конца страницы, который завершает текущую страницу. Увеличивает номер текущей страницы на единицу, а текущие номера столбца и строчки устанавливает равными единице.
Если вид файла не OUT_FILE, то возбуждается исключение MODE_ERROR.
procedure SKIP_PAGE(FILE: in FILE_TYPE); procedure SKIP_PAGE;Оперирует над файлами вида IN_FILE. Из файла читает и пропускает (игнорирует) все символы и признаки конца строчки, концая признаком конца страницы. Увеличивает текущий номер страницы на единицу, текущие номера столбца и строчки устанавливает равными единице.
Если вид файла не IN_FILE, то возбуждается исключение MODE_ERROR. При попытке прочитать признак конца файла возбуждается исключение END_ERROR.
function END_OF_PAGE(FILE : in FILE_TYPE) return BOOLEAN; function END_OF_PAGE return BOOLEAN;Оперирует над файлом вида IN_FILE. Возвращает значение TRUE, если очередными элементами файла является последовательность из признаков конца строчки и страницы или если очередным элементов является признак конца файла; в противном случае возвращает значение FALSE.
Если вид файла отличен от IN_FILE, то возбуждается исключение MODE_ERROR.
function END_OF_FILE(FILE : in FILE_TYPE) return BOOLEAN; function END_OP_FILE return BOOLEAN;Оперирует над файлом вида IN_FILE. Возвращает значение TRUE, если очередным элементом файла является признак конца файла или последовательность из признаков концастрочки, страницы и файла; в противном случае возвращает значение FALSE.
Если вид файла отличен от IN_FILE, то возбуждается исключение MODE_ERROR. Следующие подпрограммы предназначены для управления текущей позицией чтения или
записи в файл. Во всех этих подпрограммах в качестве файла по умолчанию используетсятекущий файл вывода.
procedure SET_COL(FILE : in FILE_TYPE; TO : in POSITIVE_COUNT); procedure SET_COL(TO : in POSITIVE_COUNT);Для файла вида OUT_FILE:
Если значение параметра ТО больше текущего номера столбца, то выводит пробелы, причем после вывода каждого пробела увеличивает текущий номер столбца на единицу. Это повторяется до тех пор, пока текущий номер столбца не станет равным значению параметра ТО. Если значение параметра ТО было равно текущему номеру столбца, то никаких действий не производит. Если значение параметра ТО меньше текущего номера столбца, то сначала выполняет действия, эквивалентные вызову процедуры NEW_LINE( SPACING = 1), затем выводит (ТО — 1) пробелов и текущий номер столбца устанавливает равным значению параметра ТО.
Если при ограниченной длине строчки (т.е. LINE_LENGTH для этого файла имеет ненулевое значение) значение параметра ТО оказалось больше LINE-LENGTH, то возбуждается исключение LAYOUT_ERROR.
Для файла вида IN_FILE:
Читает и пропускает (игнорирует) отдельные символы, признаки конца строчки и страницы до тех пор, пока номер столбца очередного, подлежащего чтению символа не станет равным значению параметра ТО. Если текущий номер столбца с самого начала равен этому значению, то никаких действий не производит. При передаче каждого символа или признака конца должным образом корректирует текущие номера столбца, строчки и страницы, как при работе процедуры GET (см. 5). (Короткие строчки будут пропущены целиком, пока не встретится строчка, содержащая символ в указанной позиции от начала строчки.)
При попытке чтения признака конца файла возбуждается исключение END_ERROR.
procedure SET_LINE(FILE : in FILE_TYPE; TO : in POSITIVE_COUNT); procedure SET_LINE(TO : in POSITIVE_COUNT);Для файла вида OUT_FILE:
Если значение параметра ТО больше текущего номера строчки, то эта процедура эквивалентна повторным вызовам NEW_LINE (SPACING = 1) до тех пор, пока текущий номер строчки не станет равным значению параметра ТО. Если значение параметра ТО было равно текущему номеру строчки, то никаких действий не производит. Если значение параметра ТО меньше текущего номера строчки, то эта процедура эквивалентна вызову NEW-PAGE, за которым следует вызов NEW_LINE с параметром SPACING, равным (ТО — 1).
Если при ограниченной длине страницы (т.е. PAGE-LENGTH для этого файла имеет ненулевое значение) значение параметра ТО оказалось больше PAGE-LENGTH, то возбуждается исключение LAYOUT_ERROR.
Для файла вида IN_FILE:
Результат эквивалентен повторным вызовам процедуры SKIP_LINE (SPACING = 1) до тех пор, пока текущий номер строчки не примет значение параметра ТО. Если текущий номер строчки с самого начала был равен значению параметра ТО, то никаких действий не производит. (Короткие страницы будут пропущены целиком, пока не встретится страница, содержащая строчку в указанной позиции от начала страницы.)
При попытке чтения признака конца файла возбуждается исключение END_ERROR.
function COL(FILE : in FILE_TYPE) return POSITIVE_COUNT; function COL return POSITIVE_COUNT;Возвращает текущий номер столбца. Если этот номер больше значения COUNT'LAST, это возбуждается исключениеLAYOUT_ERROR.
function LINE(FILE : in FILE_TYPE) return POSITIVE_COUNT; function LINE return POSITIVE_COUNT;Возвращает текущий номер строчки.
Если этот номер больше значения COUNT'LAST, то возбуждается исключение LAYOUT_ERROR.
function PAGE(FILE : in FILE_TYPE) return POSITIVE_COUNT; function PAGE return POSITIVE_COUNT;Возвращает текущий номер страницы.
Если этот номер больше значения COUNT'LAST, то возбуждается исключение LAYOUT_ERROR.
Номера столбца, строчки или страницы, вообще говоря, могут превысить значение COUNT'LAST (в результате ввода или вывода достаточно большого числа символов, строчек или страниц). При этом никакое исключение не возбуждается. Однако при вызове функции COL, LINE или PAGE если соответствующий номер оказался больше COUNT'LAST, то возбуждается исключение LAYOUT_ERROR.
Примечание. Признак конца страницы пропускается, если пропускается предшествующий ему признак конца строчки. Реализация может представить последовательность из таких двух признаков конца одним символом при условии, что он будет распознаваться при вводе.
Ссыпки: вид IN_FILE 14.1, длина страницы 14.3, исключение END_ERROR 14.4, исключение LAYOUT_ERROR 14.4, исключение MODE_ERROR 14.4, исключение STATUS_ERROR 14.4, максимальная длина страницы 14.3, номер строчки 14.3, открытый файл 14.1, признак конца страницы 14.3, признак конца строчки 14.3, признак конца файла 14.3, процедура GET 5, страница 14.3, строчка 14.3, текущий номер столбца 14.3, текущий номер страницы 14.3, текущий номер строчки 14.3, текущий файл по умолчанию 14.3, тип POSITIVE_COUNT 14.3, файл
5. ПРОЦЕДУРЫ ОБМЕНА
В разд. 5—10 описаны процедуры GET и PUT для элементов типов CHARACTER, STRING, числового и перечислимого. В данном разделе описаны возможности этих процедур, общие для большинства таких типов. Процедуры GET и PUT для элементов типов CHARACTER и STRING передают отдельные символьные значения, а для числовых и перечислимых типов передают лексемы.
Первым параметром всех процедур GET и PUT является файл. Если он опущен, то подразумевается, что используется текущий файл (ввода или вывода) по умолчанию. Каждая процедура GET оперирует над файлом вида IN_FILE. Каждая процедура PUT оперирует над файлом вида OUT_FILE.
Все процедуры GET и PUT меняют для заданного файла текущие номера столбца, строчки и страницы: каждая передача символа увеличивает на единицу текущий номер столбца. Каждый вывод признака конца строчки устанавливает текущий номер столбца равным единице и добавляет единицу к текущему номеру строчки. Каждый вывод признака конца страницы устанавливает текущие номера столбца и строчки равными единице и добавляет единицу к текущему номеру страницы. При вводе каждый пропуск признака конца строчки устанавливает текущий номер столбца равным единице и добавляет единицу к текущему номеру строчки;
каждый пропуск признака конца страницы устанавливает текущие номера столбца и строчки равными единице и добавляет единицу к текущему номеру страницы. Аналогичным образом определяется семантика процедур GET_LINE, PUT_LINE и SET-COL
Некоторые процедуры GET и PUT для числовых и перечислимых типов имеют параметры, задающие формат; он указывает длины полей; эти параметры принадлежат неотрицательному подтипу FIELD типа INTEGER.
Ввод-вывод значений перечислимых типов использует синтаксис соответствующих лексем. Любая процедура GET для перечислимого типа сначала пропускает все ведущие пропуски или признаки концов строчки и страницы; пропуск — это символ пробела или символ горизонтальной табуляции. Затем символы вводятся до тех пор, пока введенная последовательность является началом лексемы, соответствующей -идентификатору или символьному литералу (в частности, ввод прекращается при достижении признака конца строчки). Символ или признак конца строчки, вызвавшие прекращение ввода, остаются доступными для следующего ввода.
Процедуры GET для числовых типов имеют параметр WIDTH, задающий формат. Если он имеет нулевое значение, то процедура GET выполняется так же, как для перечислимых типов,
но вместо синтаксиса литералов перечисления используется синтаксис числовых литералов. При ненулевом значении параметра WIDTH вводится ровно WIDTH символов или, если ранее встретился признак конца строчки, все символы до признака конца строчки; в это число включаются и все ведущие пропуски. Для числовых литералов используется расширенный синтаксис, в котором допускается знак числа (но не пропуски или признаки конца строчки или страницы внутри литерала).
Любая процедура PUT для элемента числового или перечислимого типа выводит значение элемента соответственно как числовой литерал, идентификатор или символьный литерал. Перед ними могут быть выведены пробелы, если этого требуют параметры формата WIDTH или FORE (это описано ниже), и для отрицательных значений — знак минус; в случае перечислимого типа пробелы выводятся не перед литералом, а после него. Если формат в процедуре PUT задает недостаточную ширину, то он игнорируется.
Следующие две ситуации могут возникнуть при выполнении процедуры PUT для числового или перечислимого типа в случае ограниченной длины строчки используемого файла вывода (т.е. длина строчки имеет ненулевое значение). Если число выводимых символов не превышает максимальной длины строчки, но при выводе этих символов, начиная с текущего столбца, они не помещаются в текущей строчке, то перед их выводом выполняются действия, эквивалентные вызову NEW_LINE с параметром SPACING, равным единице. Если же число выводимых символов больше максимальной длины строчки, то возбуждается исключение LAYOUT_ERROR, при этом символы не выводятся.
Если используемый в процедурах GET, GET_LINE, PUT и PUT_LINE файл не открыт, то возбуждается исключение STATUS_ERROR. Если в процедурах GET и GET_LINE вид используемого файла отличен от IN_LINE или в процедурах PUT и PUT_LINE вид используемого файла отличен от OUT_FILE, то возбуждается исключение MODE_ERROR.
В процедуре GET при попытке пропуска признака конца файла возбуждается исключение END_ERROR. Если вся введенная процедурой GET последовательность символов не является лексемой соответствующего типа, то возбуждается исключение DATA_ERROR; в частности, оно возбуждается, если не было введено ни одного символа; для числового типа если был введен знак, то это правило относится к следующему за ним числовому литералу. В случае процедуры PUT, выводящей элемент типа STRING, если длина строки файла недостаточна для вывода заданного элемента, то возбуждается исключение LAYOUT_ERROR.