Spec-Zone.ru › Ada 2005
Справочник Ada 2005

A.10.9 Ввод-вывод для вещественных типов

Статическая семантика

Следующие процедуры определены в обобщенных пакетах Float_IO, Fixed_IO и Decimal_IO, которые необходимо экземпляризировать для соответствующего типа с плавающей точкой, обычного типа с фиксированной точкой или десятичного типа с фиксированной точкой соответственно (обозначено Num в спецификациях).
Значения выводятся в виде десятичных литералов без символов нижнего подчеркивания. Формат каждого выводимого значения состоит из поля Fore, десятичной точки, поля Aft и (если предоставлен параметр Exp, отличный от нуля) буквы E и поля Exp. Два возможных формата соответствуют:
Fore . Aft
и:
Fore . Aft E Exp
без пробелов между этими полями. Поле Fore может содержать ведущие пробелы и знак минус для отрицательных значений. Поле Aft содержит только десятичные цифры (возможно, с последующими нулями). Поле Exp содержит знак (плюс или минус) и показатель степени (возможно, с ведущими нулями).
Для типов с плавающей точкой длины этих полей по умолчанию определяются следующими переменными, объявленными в обобщенном пакете Float_IO:
Default_Fore : Field := 2;
Default_Aft : Field := Num'Digits-1;
Default_Exp : Field := 3;
Для обычных или десятичных типов с фиксированной точкой длины этих полей по умолчанию определяются следующими переменными, объявленными в обобщенных пакетах Fixed_IO и Decimal_IO соответственно:
Default_Fore : Field := Num'Fore;
Default_Aft : Field := Num'Aft;
Default_Exp : Field := 0;
Предоставляются следующие процедуры:
procedure Get(File : in File_Type; Item : out Num; Width : in Field := 0);
procedure Get(Item : out Num; Width : in Field := 0);
Если значение параметра Width равно нулю, пропускаются любые ведущие пробелы, разделители строк или разделители страниц, затем считывается самая длинная возможная последовательность символов, соответствующая синтаксису одного из следующих (см. 2.4):
  • [+|–]numeric_literal
  • [+|–]numeral.[exponent]
  • [+|–].numeral[exponent]
  • [+|–]base#based_numeral.#[exponent]
  • [+|–]base#.based_numeral#[exponent]
Если указано ненулевое значение Width, то считывается ровно Width символов или символы (возможно, ни одного) до разделителя строки, что произойдёт первым; любые пропущенные ведущие пробелы включаются в подсчёт.
Возвращает в параметр Item значение типа Num, соответствующее введённой последовательности, сохраняя знак (положительный, если не был указан) нулевого значения, если Num — тип с плавающей точкой и Num'Signed_Zeros — True.
Исключение Data_Error передаётся, если введённая последовательность не имеет требуемого синтаксиса или полученное значение не является подтипом Num.
procedure Put(File : in File_Type;
Item : in Num;
Fore : in Field := Default_Fore;
Aft : in Field := Default_Aft;
Exp : in Field := Default_Exp);

procedure Put(Item : in Num;
Fore : in Field := Default_Fore;
Aft : in Field := Default_Aft;
Exp : in Field := Default_Exp);
Выводит значение параметра Item в виде десятичного литерала с форматом, определённым Fore, Aft и Exp. Если значение отрицательное, или если Num — тип с плавающей точкой, где Num'Signed_Zeros — True, и значение — отрицательно, то знак минус включается в целую часть. Если Exp имеет значение ноль, то целая часть, подлежащая выводу, содержит столько цифр, сколько нужно для представления целой части значения Item, при необходимости переопределяя Fore, или состоит из цифры ноль, если значение Item не имеет целой части.
Если Exp имеет значение, большее нуля, то целая часть, подлежащая выводу, содержит одну цифру, отличную от нуля, за исключением значения 0.0 для Item.
Однако в обоих случаях, если целая часть, подлежащая выводу, содержит меньше символов, чем Fore, включая любой знак минус, то сначала выводятся ведущие пробелы для компенсации разницы. Количество цифр дробной части задаётся Aft или равно единице, если Aft равно нулю. Значение округляется; значение ровно в половину в последнем разряде округляется от нуля.
Если Exp равно нулю, то части показателя степени нет. Если Exp имеет значение, большее нуля, то часть показателя степени, подлежащая выводу, содержит столько цифр, сколько нужно для представления части показателя степени значения Item (для которой используется целая часть из одной цифры), и включает начальный знак (плюс или минус). Если часть показателя степени, подлежащая выводу, содержит меньше символов, чем Exp, включая знак, то ей предшествуют ведущие нули, чтобы компенсировать разницу. Для значения 0.0 Item показатель степени имеет значение ноль.
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;
Aft : in Field := Default_Aft;
Exp : in Field := Default_Exp);
Выводит значение параметра Item в заданную строку, следуя тому же правилу, что и при выводе в файл, используя значение Fore, такое, что последовательность выводимых символов точно заполняет строку, включая любые ведущие пробелы.
Float_Text_IO — это пакет библиотеки, который является необобщенным эквивалентом Text_IO.Float_IO для предопределенного типа Float:
with Ada.Text_IO;
package Ada.Float_Text_IO is new Ada.Text_IO.Float_IO(Float);
Для каждого предопределенного типа с плавающей точкой предоставляется необобщенный эквивалент Text_IO.Float_IO с такими именами, как Ada.Long_Float_Text_IO.

Разрешения реализации

Реализация может расширить Get и Put для типов с плавающей точкой, чтобы поддерживать такие специальные значения, как бесконечности и NaN.
Реализация Put не обязана производить выводимое значение с большей точностью, чем поддерживается для базового подтипа. Дополнительная точность, если таковая имеется, выводимого значения Put, когда количество запрошенных цифр в целой и дробной частях превышает необходимую точность, определяется реализацией.
Необобщенные эквивалентные пакеты могут, но не обязаны, быть фактическими экземплярами обобщенного пакета для соответствующего предопределенного типа.
ПРИМЕЧАНИЯ
30 Для элемента с положительным значением, если вывод в строку точно заполняет строку без ведущих пробелов, то вывод соответствующего отрицательного значения вызовет Layout_Error.
31 Правила для атрибута Value (см. 3.5) и правила для Get основаны на том же наборе форматов.

Примеры

Этот абзац был удален.
package Real_IO is new Float_IO(Real); use Real_IO;
-- формат по умолчанию используется при экземпляризации, Default_Exp = 3
X : Real := -123.4567; -- цифры 8 (см. 3.5.7)
Put(X); -- формат по умолчанию "–​1.2345670E+02"
Put(X, Fore => 5, Aft => 3, Exp => 2); -- "bbb–​1.235E+2"
Put(X, 5, 3, 0); -- "b–​123.457"


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API