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.
Управление файлами
Для текстовых файлов допустимы только виды 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.
Файлы ввода и вывода по умолчанию
Следующие подпрограммы служат для управления файлами по умолчанию, используемыми при отсутствии параметра-файла в процедурах 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.
С п е ц и ф и к а ц и и д л и н с т р о ч е к и страниц
Описанные в этом разделе подпрограммы связаны со структурой строчек и страниц файла вида 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;
Возвращает максимальную длину страницы, установленную для данного файла, или нуль, если длина страницы не ограничена.
О п е р а ц и и вад столбцами, строчками и страницами
Описанные в этом разделе подпрограммы предназначены для явного управления структурой строчек и страниц файла; они оперируют либо над файлом, заданным первым параметром, либо, при отсутствии такого пара- метра-файла, над текущим файлом (ввода или вывода) по умолчанию. Если используемый в этих подпрограммах файл не открыт, то возбуждается исключение 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. Если текущая строчка не завершена или текущая страница пустая (т. е. текущие номера строчки или столбца оба равны единице), то выводит признак конца строчки. Затем выводит признак конца страницы, который завершает текущую страницу. Увеличивает номер текущей страницы на единицу, а текущие номера столбца и строчки устанавливает равными единице.