Справочник Ada 2012
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 для числовых и типов перечислений имеют параметры формат, которые задают длину поля; эти параметры являются подтипом неотрицательных целых чисел типа Field.
Ввод-вывод значений перечисления использует синтаксис соответствующих лексических элементов. Любая процедура Get для типа перечисления начинает с пропуска всех начальных пробелов, или разделителей строк или страниц. Пробел определяется как пробел или символ горизонтальной табуляции. Далее символы вводятся только до тех пор, пока вводимая последовательность является начальной последовательностью идентификатора или символьной литеральной константы (в частности, ввод прекращается при встрече разделителя строки). Символ или разделитель строки, который приводит к прекращению ввода, остается доступным для последующего ввода.
Для числового типа процедуры Get имеют параметр формата, называемый Width. Если заданное значение этого параметра равно нулю, процедура 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"