Руководство по Ada (Ada 2022)
A.10.8 Ввод-вывод для целых типов
Статическая семантика
Ниже приведены процедуры, определенные в обобщенных пакетах Integer_IO и Modular_IO, которые необходимо инстанциировать для соответствующего знакового целого или модульного типа соответственно (указано Num в спецификациях).
Значения выводятся как десятичные или основанные литералы, без символов подчеркивания или показателя степени, и, для Integer_IO, предваряются знаком минус, если отрицательные. Формат (который включает любые ведущие пробелы и знак минус) может быть задан необязательным параметром ширины поля. Значения ширины полей в форматах вывода являются подтипом целых чисел без знака Field. Значения оснований являются подтипом целых чисел Number_Base.
subtype Number_Base is Integer range 2 .. 16;
Значение по умолчанию для ширины поля и основания, используемое процедурами вывода, определяются следующими переменными, которые объявлены в обобщенных пакетах Integer_IO и Modular_IO:
Default_Width : Field := Num'Width;
Default_Base : Number_Base := 10;
Default_Base : Number_Base := 10;
Предоставляются следующие процедуры:
procedure Get(File : in File_Type; Item : out Num; Width : in Field := 0);
procedure Get(Item : out Num; Width : in Field := 0);
procedure Get(Item : out Num; Width : in Field := 0);
Если значение параметра Width равно нулю, пропускаются любые ведущие пробелы, знаки конца строки или знаки конца страницы, затем считывается знак плюс, если он присутствует, или (только для знакового типа) знак минус, если он присутствует, затем считывается самая длинная возможная последовательность символов, соответствующая синтаксису числового литерала без точки. Если указано ненулевое значение Width, то вводятся ровно Width символов или символы (возможно, ни одного) до знака конца строки, в зависимости от того, что произойдет раньше; любые пропущенные ведущие пробелы включаются в счет.
Возвращает в параметре Item значение типа Num, соответствующее введенной последовательности.
Исключение Data_Error распространяется, если последовательность прочитанных символов не является допустимым целочисленным литералом или если полученное значение не принадлежит подтипу Num.
procedure Put(File : in File_Type;
Item : in Num;
Width : in Field := Default_Width;
Base : in Number_Base := Default_Base);
procedure Put(Item : in Num;
Width : in Field := Default_Width;
Base : in Number_Base := Default_Base);
Item : in Num;
Width : in Field := Default_Width;
Base : in Number_Base := Default_Base);
procedure Put(Item : in Num;
Width : in Field := Default_Width;
Base : in Number_Base := Default_Base);
Выводит значение параметра Item в виде целочисленного литерала без подчеркиваний, показателя степени и ведущих нулей (но одиночный ноль для значения ноль) и предшествующего знака минус для отрицательного значения.
Если полученная последовательность символов для вывода имеет меньше, чем Width символов, то ведущие пробелы сначала выводятся, чтобы заполнить разницу.
Использует синтаксис десятичного литерала, если параметр Base имеет значение десять (явное или через Default_Base); в противном случае использует синтаксис основанного литерала, при этом все буквы записываются заглавными.
procedure Get(From : in String; Item : out Num; Last : out Positive);
Считывает целое значение из начала заданной строки, следуя тем же правилам, что и процедура Get, которая считывает целое значение из файла, но обрабатывает конец строки как знак конца файла. Возвращает в параметре Item значение типа Num, соответствующее введенной последовательности. Возвращает в Last значение индекса, такое, что From(Last) — последний прочитанный символ.
Исключение Data_Error распространяется, если введенная последовательность не имеет требуемого синтаксиса или если полученное значение не принадлежит подтипу Num.
procedure Put(To : out String;
Item : in Num;
Base : in Number_Base := Default_Base);
Item : in Num;
Base : in Number_Base := Default_Base);
Выводит значение параметра Item в заданную строку, следуя тому же правилу, что и для вывода в файл, используя длину заданной строки как значение для Width.
Integer_Text_IO — это пакет библиотеки, который является необобщенным эквивалентом Text_IO.Integer_IO для предопределенного типа Integer:
with Ada.Text_IO;
package Ada.Integer_Text_IO is new Ada.Text_IO.Integer_IO(Integer);
package Ada.Integer_Text_IO is new Ada.Text_IO.Integer_IO(Integer);
Для каждого предопределенного знакового целого типа предоставляется необобщенный эквивалент Text_IO.Integer_IO с названиями, такими как Ada.Long_Integer_Text_IO.
Разрешения на реализацию
Необобщенные пакеты могут быть фактическими инстанциациями обобщенного пакета для соответствующего предопределенного типа, хотя это не требуется.
Этот абзац был удален.
Примеры
Примеры использования инстанцирования Text_IO.Integer_IO:
subtype Byte_Int is Integer range -127 .. 127;
package Int_IO is new Integer_IO(Byte_Int); use Int_IO;
-- формат по умолчанию используется при инстанцировании,
-- Default_Width = 4, Default_Base = 10
package Int_IO is new Integer_IO(Byte_Int); use Int_IO;
-- формат по умолчанию используется при инстанцировании,
-- Default_Width = 4, Default_Base = 10
Put(126); -- "b126"
Put(-126, 7); -- "bbb–126"
Put(126, Width => 13, Base => 2); -- "bbb2#1111110#"
Put(-126, 7); -- "bbb–126"
Put(126, Width => 13, Base => 2); -- "bbb2#1111110#"