Числовое форматирование. Лексический разбор

   
На этом шаге мы рассмотрим средства работы с числами, которые представлены строкой.

   
Фацет num_get предназначен для лексического разбора текстовых представлений чисел. По аналогии с num_put он оформляется в
виде шаблона с двумя аргументами: типом символов charT и типом итератора ввода InIt, который по умолчанию равен
istreambuf_iterator<charT>. Фацет поддерживает набор функций get(), различающихся только по типу последнего аргумента. Пример использования фацета
num_get:

std::locale    loc;              // Локальный контекст
InIt           beg = ...;        // Начало входной последовательности
InIt           end = ...;        // Конец входной последовательности
std::ios_base& fmt = ...;        // Поток, определяющий формат ввода
std::ios_base::iostate err;      // Состояние после вызова
T              value = ...;      // Значение после успешного вызова

// Получение фацета разбора числовых данных для контекста loc
const std::num_get<charT,InIt>& ng
 = std::use_facet<std::num_get<charT,InIt> >(loc);

// Чтение данных с использованием фацета
ng.get(beg, end, fmt, err, value);

   
В этом фрагменте делается попытка выполнить разбор числового значения, соответствующего типу Т, из последовательности символов
между beg и end. Формат предполагаемого числового значения определяется аргументом fmt. Если разбор завершается
неудачей, в переменной еrr устанавливается флаг ios_base::failbit; если все прошло нормально, состояние ios_base::goodbit
сохраняется в err, а полученное значение - в value. Переменная value изменяется только в случае успешного разбора. Если вся
последовательность символов была полностью использована, функция get() возвращает второй параметр (end). В противном случае
возвращается итератор, указывающий на первый символ, который не был обработан как часть числового значения.

   
Фацет num_get содержит функции чтения для типов bool, long, unsigned short, unsigned int, unsigned long, float, double и long double.
Некоторые из этих типов (например, unsigned short) не имеют соответствующих функций в фацете num_put. Дело в том, что вывод
значения типа unsigned short дает такой же результат, что и вывод значения типа unsigned short, приведенного к типу unsigned long.
С другой стороны, чтение значения типа unsigned long с последующим преобразованием к unsigned short может дать результат,
отличный от прямого чтения unsigned short.

   
Стандарт требует, чтобы в каждом локальном контексте хранились две специализации num_get<char> и num_get<wchar_t> (в
обеих специализациях для второго аргумента используется значение по умолчанию). Кроме того, стандартная библиотека C++ поддерживает
все специализации, у которых в первом аргументе шаблона передается тип символа, а во втором - тип итератора вывода. Как и в случае с num_put,
стандарт не требует, чтобы эти специализации хранились в каждом локальном контексте.

   
На следующем шаге мы рассмотрим форматирование времени и даты.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий