Программирование >>  Операторы преобразования типа 

1 ... 210 211 212 [ 213 ] 214 215 216 ... 239


Для этого можно определить для потоковых буферов операторы << и .

О При получении указателя на потоковый буфер оператор << выводит все накопленные данные. Вероятно, это самый быстрый способ копирования файлов с использованием потоков данных С++. Пример:

io/copyl.cpp finclude <iostreani>

int main О {

Копирование стандартного ввода в стандартный вывод std::cout std::cin.rdbuf():

в этом фрагменте функция rdbufO возвращает буфер cin (см. с. 613). Следовательно, программа копирует весь стандартный входной поток данных в стандартный выходной поток.

О При получении указателя на потоковый буфер оператор >> выполняет прямое чтение данных. Например, копирование стандартного входного потока данных в стандартный выходной поток также может выполняться следующим образом:

1о/сору2.срр finclude <iostream>

int main О *

{. *

Копирование стандартного ввода в стандартный вывод std;:cin std::noskipws std::cout.rdbuf():

Обратите внимание на сброс флага skipws. В противном случае будут проигнорированы начальные пропуски во входных данных (см. с. 600).

Впрочем, прямая работа с потоковым буфером может быть оправданна даже при форматированном вводе-выводе. Например, если программа в цикле вводит много числовых значений, может оказаться достаточным сконструировать всего один объект sentry, существующий на протяжении всего цикла. Внутри цикла пропуски игнорируются вручную (использование манипулятора ws также привело бы к конструированию объекта sentry), а прямое чтение числовых данных осуществляется фацетом num get (см. с. 677).

Учтите, что потоковый буфер не обладает собственным состоянием ошибки. Он также ничего не знает о входных или выходных потоках, которые могут к нему подключиться. Следовательно, внутри следующего фрагмента состояние ошибки in не может измениться из-за сбоя или достижения конца файла:

Копирование содержимого in в out out in.rdbuf():



Интернационализация

с развитием глобального рынка интернационализация стала играть более важную роль в разработке программного обеспечения. По этой причине в стандартную библиотеку С++ были включены средства написания локализованного кода. В основном они связаны с вводом-выводом и обработкой строк. Этим средствам и посвящена данная глава. Большое спасибо Дитмару Кюлю (Dietmar Kuhl), эксперту в области ввода-вывода и средств интернационализации стандартной библиотеки С++, - он написал большую часть этой главы.

Стандартная библиотека С++ предоставляет общие средства поддержки национальных стандартов без привязки к конкретным системам и правилам. Например, строки не ограничиваются конкретным типом символов, чтобы обеспечить поддержку 16-разрядных азиатских кодировок символов. При интернационализации программ должны учитываться следующие обстоятельства.

О Разные кодировки символов обладают разными свойствами. Для работы с ними необходимы гибкие решения практических вопросов, например, что считать буквой или, еще хуже, какой тип должен использоваться для представления символов. Тип char не подходит для кодировок, содержащих более 256 символов.

О Пользователь рассчитывает, что применяемая им программа соответствует национальным и культурным стандартам (например, при форматировании денежных величин, чисел и логических значений).

В обоих случаях стандартная библиотека С++ предоставляет соответствующие средства.

Основной механизм интернационализации основан на использовании объекта локального контекста. Локальный контекст (locale) отражает расширяемый набор правил, адаптируемых для конкретных национальных стандартов. Локальные контексты уже применялись в языке С. В стандарте С++ этот механизм был обобщен и стал более гибким. Механизм локальных контекстов С++ может использоваться для выполнения любых настроек в зависимости от рабочей среды или предпочтений пользователя. Например, его можно расширить так, чтобы он учитывал единицы измерения, часовые пояса, стандартный размер бумаги и т. д.



Многие механизмы интернационализации практически не требуют дополнительной работы со стороны программиста. Например, в потоковом механизме ввода-вывода С++ числовые данные форматируются по правилам локального контекста. Программисту остается лишь позаботиться о том, чтобы классы потоков данных для ввода-вывода учитывали предпочтения пользователя.

Наряду с автоматическим использованием программист может напрямую обращаться к объектам локального контекста для форматирования, классификации символов и т. д. Некоторые средства интернационализации, поддерживаемые стандартной библиотекой С++, не требуются самой библиотеке - программисты должны вызывать эти функции в своих программах. Например, в стандартной библиотеке С++ не определены потоковые функции для форматирования времени, даты или денежрплх величин. Чтобы выполнить такое форматирование, необходимо вызвать соответствующую функцию (например, го пользовательского потокового оператора для вывода объектов денежных величин).

Интернационализация строк и потоков данных основана на концепции трактовок символов. Трактовки определяют базовые свойства и операции, зависящие от кодировки (такие, как признак конца файла или функции сравнения, присваивания и копирования строк).

Классы интернационализации были включены в стандарт относительно поздно. Хотя общий механизм чрезвычайно гибок, он нуждается в некоторой доработке. Например, функции контекстного сравнения строк (то есть сравнения строк с учетом правил локального контекста) используют только итераторы типа const charT*, где charT* - некоторый тип символов. Хотя с очень большой вероятностью в классе basic string<charT> задействуется именно этот тип итератора, это вовсе не гарантировано. Следовательно, не гарантировано и то, что строковые итераторы могут передаваться в аргументах функций контекстного сравнения строк. С другой стороны, результат вызова функции data() класса basic string может передаваться функциям контекстного сравнения.

Различия в кодировках символов

Одна из проблем, решаемых средствами интернационализации - поддержка разных кодировок символов. Эта проблема характерна в основном для Азии, где для представления символов используются разные кодировки. Как правило, в таких кодировках для кодирования каждого символа приходится задействовать более 8 бит, поэтому обработка текста требует новых концепций и функций.

Расширенные и многобайтовые кодировки

Существуют два основных принципа определершя кодировок, содержащих более 256 символов: многобайтовое и расширенное представления.

О В многобайтовых кодировках символы представляются переменным количеством байтов. За однобайтовым символом (например, символом из кодировки ISO Latin-1) может следовать трехбайтовый символ (японский иероглиф).



1 ... 210 211 212 [ 213 ] 214 215 216 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика