Справочник Ada 2005
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 для числовых и перечислительных типов имеют параметр формата, который задаёт длину поля; эти параметры являются неотрицательными подтипами поля типа Integer.
Ввод-вывод значений перечисления использует синтаксис соответствующих лексических элементов. Любая процедура 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"