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.DEV1CE ERROR;

END_ERROR: exception renames IO_EXCEPTIONS.END-ERROR;

DATA-ERROR: exception renames IO_EXCEPTIONS.DATA_ERROR;

private

- - зависит от реализации

end DIRECT_IO;

14.3. Ввод-вывод текстов

В этом разделе описывается пакет ТЕХТ_Ю, который обеспечивает возможности ввода и вывода в удобной для читателя форме. Каждый файл читается или записывается последовательно посимвольно, символы после­довательно группируются в строчки, последовательность строчек — в стра­ницы. В разд. 14.3.10 приведена спецификация этого пакета.

Возможности управления файлами, описанные в разд. 14.2.1 и 14.2.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.

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

Для текстовых файлов допустимы только виды IN_FILE и OUT_FILE. К ним также применимы приведенные в разд. 14.2.1 подпрограммы управ­ления внешними файлами, а также приведенная в разд. 14.2.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, то длина строчки и длина страницы становятся неограниченными. Для всех видов файла текущие номера столбца, строчки и страницы устанавливаются равными единице.

При попытке изменить вид текущего файла ввода по умолчанию или те­кущего файла вывода по умолчанию процедурой PESET возбуждается ис­ключение MODE_ERROR.

  1. Файлы ввода и вывода по умолчанию

Следующие подпрограммы служат для управления файлами по умолча­нию, используемыми при отсутствии параметра-файла в процедурах 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_TYPE;

Возвращает стандартный файл вывода (см. разд. 14.3).

function CURRENT-INPUT return FILE_TYPE;

Возвращает текущий файл ввода по умолчанию.

function CURRENT-OUTPUT return FILE_TYPE;

Возвращает текущий файл по умолчанию.

Примечание. Стандартные файлы ввода и вывода не могут быть открыты, закры­ты, переустановлены и уничтожены, потому что в соответствующих процедурах пара­метр FILE имеет вид in out.

  1. С п е ц и ф и к а ц и и д л и н с т р о ч е к и страниц

Описанные в этом разделе подпрограммы связаны со структурой стро­чек и страниц файла вида 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_TYPE; 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 FILETYPE) return COUNT;

function PAGE „LENGTH return COUNT;

Возвращает максимальную длину страницы, установленную для данно­го файла, или нуль, если длина страницы не ограничена.

  1. О п е р а ц и и вад столбцами, строчками и стра­ницами

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

procedure NEWSLINE (FILE: in FILE_PYPE;

SPACING: in POSITIVE-COUNT: = 1) ;

procedure NEW_LINE (SPACING: in POSITIVE „COUNT: = 1);

Оперирует над файлом вида OUT_FILE.

Если SPACING равно единице, то выводит признак конца строчки, а текущий номер столбца устанавливается равным единице. Затем увеличива­ет текущий номер строчки на единицу, кроме случая, когда текущий номер строчки уже был равен или превышал максимальную длину страницы; в этом случае сначала выводит признак конца страницы, увеличивает затем текущий номер страницы на единицу, а текущий номер строчки устанавли­вает равным единице.

Если SPACING больше единицы, то указанные действия повторяются SPACING раз.

Если вид файла не OUT-FILE, то возбуждается исключение MODE-ERROR.

procedure SKIP_LINE (FILE: in FILE„TYPE;

SPACING: in POSITIVE_COUNT: = 1) ;

procedure SKIP„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. Если текущая строчка не за­вершена или текущая страница пустая (т. е. текущие номера строчки или столбца оба равны единице), то выводит признак конца строчки. Затем вы­водит признак конца страницы, который завершает текущую страницу. Уве­личивает номер текущей страницы на единицу, а текущие номера столбца и строчки устанавливает равными единице.