Справочник по Ada 95
A.10.6 Процедуры Get и Put
Статическая семантика
Процедуры Get и Put для элементов типа Character, String, числовых типов и типов перечислений описаны в последующих подпунктах. Особенности этих процедур, общие для большинства этих типов, описаны в данном подпункте. Процедуры Get и Put для элементов типа Character и String работают с отдельными значениями символов; процедуры Get и Put для числовых и типов перечислений обрабатывают элементы как лексические элементы.
Все процедуры Get и Put имеют формы с параметром файла, указанным вначале. Если этот параметр опущен, предполагается указание соответствующего текущего файла по умолчанию (ввода или вывода). Каждая процедура Get работает с файлом в режиме In_File. Каждая процедура Put работает с файлом в режиме Out_File или Append_File.
Все процедуры Get и Put сохраняют текущие номера столбца, строки и страницы указанного файла: эффект каждой из этих процедур на эти номера является результатом влияния отдельных операций передачи символов и отдельных операций вывода или пропуска разделителей. Каждая передача символа увеличивает текущий номер столбца на единицу. Каждый вывод разделителя строки устанавливает текущий номер столбца в единицу и увеличивает текущий номер строки на единицу. Каждый вывод разделителя страницы устанавливает текущие номера столбца и строки в единицу и увеличивает текущий номер страницы на единицу. При вводе каждый пропуск разделителя строки устанавливает текущий номер столбца в единицу и увеличивает текущий номер строки на единицу; каждый пропуск разделителя страницы устанавливает текущие номера столбца и строки в единицу и увеличивает текущий номер страницы на единицу. Аналогичные соображения применяются к процедурам Get_Line, Put_Line и Set_Col.
Несколько процедур Get и Put для числовых и типов перечислений имеют параметр format, который задаёт длину поля; эти параметры являются неотрицательными подтипами Field типа Integer.
Ввод-вывод значений перечислений использует синтаксис соответствующих лексических элементов. Любая процедура Get для типа перечисления начинает с пропуска любых ведущих пробелов или разделителей строки или страницы. Процедуры Get для числовых или типов перечислений начинают с пропуска ведущих пробелов, где пробел определяется как пробел или символ горизонтальной табуляции. Затем символы вводятся только до тех пор, пока вводимая последовательность является начальной последовательностью идентификатора или символьной константы (в частности, ввод прекращается при встрече разделителя строки). Символ или разделитель строки, который вызывает прекращение ввода, остаётся доступным для последующего ввода.
Для числового типа процедуры Get имеют параметр формата, называемый Ширина. Если заданное значение для этого параметра равно нулю, процедура Get продолжает действовать так же, как для типов перечислений, но используя синтаксис числовых литералов вместо синтаксиса литералов перечислений. Если задано ненулевое значение, то вводятся ровно Width символов или символы до разделителя строки, что произойдёт первым; любые пропущенные ведущие пробелы включаются в подсчёт. Синтаксис, используемый для числовых литералов, представляет собой расширенный синтаксис, который допускает ведущий знак (но без промежуточных пробелов или разделителей строки или страницы), а также (для вещественных типов) целочисленный литерал, а также формы, имеющие только цифры до точки или только после точки.
Любая процедура Put для элемента числового или типа перечисления выводит значение элемента как числовой литерал, идентификатор или символьный литерал, как это уместно. Перед этим добавляются ведущие пробелы, если это требуется параметрами формата Width или Fore (как описано в последующих подпунктах), а затем знак минус для отрицательного значения; для типа перечисления пробелы добавляются после, а не в начале. Формат, заданный для процедуры Put, переопределяется, если он недостаточно широк, используя минимально необходимую ширину.
Возникают ещё два случая для процедур Put для числовых и типов перечислений, если длина строки указанного файла вывода ограничена (то есть, если она не имеет обычного значения ноль). Если количество символов, которые должны быть выведены, не превышает максимальную длину строки, но таковы, что они не помещаются в текущей строке, начиная с текущего столбца, то (по сути) вызывается New_Line (с отступом в один символ) перед выводом элемента. В противном случае, если количество символов превышает максимальную длину строки, то возникает исключение Layout_Error и ничего не выводится.
Исключение Status_Error передаётся любой из процедур Get, Get_Line, Put и Put_Line, если используемый файл не открыт. Исключение Mode_Error передаётся процедурами Get и Get_Line, если режим используемого файла не In_File; и процедурами Put и Put_Line, если режим не Out_File или Append_File.
Исключение End_Error передаётся процедурой Get, если производится попытка пропустить разделитель файла. Исключение Data_Error передаётся процедурой Get, если конечная последовательность ввода не является лексическим элементом, соответствующим типу, в частности, если не было введено ни одного символа; для этого теста ведущие пробелы игнорируются; для элемента числового типа, когда вводится знак, это правило применяется к последующему числовому литералу. Исключение Layout_Error передаётся процедурой Put, которая выводит в параметр типа String, если длина фактической строки недостаточна для вывода элемента.
Примеры
В примерах, здесь и в подпунктах A.10.8 и A.10.9, кавычки строки и строчная буква b не передаются: они показаны только для отображения структуры и пробелов.
N : Integer;
...
Get(N);
...
Get(N);
-- Символы на входе Последовательность ввода Значение N
-- bb-12535b -12535 -12535
-- bb12_535e1b 12_535e1 125350
-- bb12_535e; 12_535e (нет) Возникло исключение Data_Error
-- bb-12535b -12535 -12535
-- bb12_535e1b 12_535e1 125350
-- bb12_535e; 12_535e (нет) Возникло исключение Data_Error
Пример переопределённого параметра ширины:
Put(Item => -23, Width => 2); -- "-23"