|
Программирование >> Операторы преобразования типа
Присваивание локального контекста стандартному каналу вывода cout.imbueClangLocale); Обработка имени локального контекста bool isGerman: if (langLocale.nameO == de DE langLocale.nameO == de langLocale.nameO == gerroan ) { IsGerman - true: else { isGerman = false; Чтение локального контекста для ввода if (isGerman) { cout Sprachumgebung fuer Eingaben: : else { cout Locale for input: ; string s: cin s: if (!cin) { if (isGerman) { cerr FEHLER beim Einlesen der Sprachumgebung endl: else { cerr ERROR while reading the locale endl: return EXITJAILURE: locale cinLocale(s.c str()): Присваивание локального контекста стандартному каналу ввода cin.imbue(cinLocale): Чтение и запись вещественных чисел в цикле double value: while (cin value) { cout value endl; В этом примере следующая команда создает объект класса locale: locale langLocaleC ): Пустая строка вместо имени локального контекста имеет особый смысл: она обозначает локальный контекст по умолчанию для окружения пользователя (обычно определяется переменной окружения LANG). Этот локальный контекст связывается со стандартным входным потоком данных командой: cout.imbueClangLocale); Показанное ниже выражение возвращает имя локального контекста по умолчанию в виде объекта типа string (см. главу И): TangLocale.nameC) Следующий фрагмент конструирует локальный контекст по имени, прочитанному из стандартного входного потока данных: string S: cin s; locale cinLocale(s.c str()): Для этого из стандартного входного потока данных читается слово, передаваемое в аргументе конструктора. Если попытка чтения завершается неудачей, во входном потоке данных устанавливается флаг ios base::failbit. Программа проверяет и обрабатывает эту ситуацию: if (!cin) { if (isGerman) [ сегг FEHLER beiro Einlesen der Sprachumgebung endl; else { cerr ERROR while reading the locale endl; return EXITJAILURE: Если содержимое строки не позволяет сконструировать локальный контекст, также генерируется исключение runtime error. Если программист хочет соблюдать национальные стандарты, он должен задействовать соответствующие объекты локальных контекстов. Статическая функция globalO класса locale устанавливает новый глобальный объект локального контекста. Этот объект будет использоваться по умолчанию функциями, которым при вызове может передаваться необязательный аргумент с локальным контекстом. Если объект локального контекста, назначенный функцией global(), обладает именем, вызов global() также обеспечивает правильную реакцию со стороны функций С с поддержкой локальных контекстов. Если имя отсутствует, то результаты вызова функций С зависят от реализации. Пример назначения глобального объекта локального контекста в зависимости от окружения, в котором выполняется программа: std::locale::global(std::localeC )): В частности, информация о назначенном контексте передается функциям С, которые будут вызываться в будущем. Последствия будут такими же, как при следующем вызове: std::setlocaTe(LC ALL. ) Тем не менее глобальное назначение локального контекста не заменяет локальные контексты, уже хранящиеся в объектах. Оно лишь заменяет объект локального контекста, копируемый при создании контекста конструктором по умолчанию. Например, вызов locale::global() не влияет на объекты локальных контекстов, хранящиеся в объектах потоков данных. Если вы хотите, чтобы существующий поток данных использовал конкретный локальный контекст, свяжите его с этим контекстом при помощи функции imbue(). Глобально назначенный контекст используется при создании объектов локального контекста конструктором по умолчанию. В этом случае новый контекст представляет собой копию глобально назначенного контекста на момент конструирования. Следующий фрагмент назначает контекст по умолчанию для стандартных потоков данных: Глобальная регистрация объекта локального контекста для потоков std: ;cin.inibue(std: std::cout.imbue(std std:;cerr.1mbue(std localeO); :locale()): :localeC)): При использовании локальных контекстов в С++ важно помнить, что они почти не связаны с локальными контекстами С. Твердо уверенным можно быть только в одном: единый локальный контекст С изменяется при глобальном назначении именованного объекта локального контекста С++. В общем случае нельзя предполагать, что функции С и С++ работают в одних и тех же локальных контекстах. Фацеты На функциональном уровне локальный контекст делится на несколько специальных объектов. Объект, обеспечивающий работу некоторого аспекта интернационализации, называется фацетом. Это означает, что объект локального контекста может рассматриваться как контейнер для различных фацетов. Для обращения к некоторому аспекту локального контекста тип соответствующего фацета передается в аргументе шаблонной функции use facet(). Например, следующее выражение обращается к фацету типа numpunct для типа символов char объекта локального контекста 1ос: std: :usG facet<std-. :numpunct<char> >С1ос) Каждый тип фацета определяется в виде класса, предоставляющего определенные сервисы. Например, тип фацета numpunct предоставляет сервис форматирования числовых и логических величин. Так, следующее выражение возвращает строку, используемую для представления true в локальном контексте 1ос; std::use facet<std::numpunct<char> >С1ос).truenameO
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |