Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 [ 182 ] 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

Назначение потоковых буферных классов

Биб,лиогека lOStream проектировалась со строгим разделением обязанностей. Классы, производные от basicjos, «всего лишь» ограничиваются форматированием данных. Онерации чтения и записи символов выполняются потоковыми буферами, которые представлены объектами, подчиненными но отношению к классу basic ios. Потоковые буферы обеспечивают выполнеппс чтения/записи в символьных буферах и помогают абстрагироваться от внешнего представления (например, файлов или строковых данных).

Потоковые буферы играют важную роль при выполнении ввода-вьшода с новыми внешними представлениями (например, сокетами или компонентами графического интерфейса), перенаправлении потоков данных или их конвейерном объединении (например, при сжатии выходных данных перед их передачей в другой поток данных). Кроме того, потоковые буферы обеспечивают синхронизацию при одновременном вводе-выводе с одним внешним представлением. Дополнительная информация приведена на с. 613.

Потоковые буферы упрощают определение новых «внешних представлений» (скажем, предназначенных для работы с новым носителем данных). Для этого требуется лишь объявить новый потоковый буферный класс, производный от basic streambuf<> (или его подходящей специализации) и определить функции чтения и/или записи символов для нового внешнего представления. Все возможности форматированного ввода-вывода автоматически становятся доступными, когда объект потока данных инициализируется для использования объекта нового потокового буферного класса. На с. 636 рассказано, как определяются новые потоковые буферы для работы со специальными носителями данных.

Подробные определения классов

Как и все шаблонные классы библиотеки lOStream, шаблон basicjoso параметризуется по двум аргументам, а его определение выглядит так:

namespace std {

template <class charT.

class traits = ch3r traits<charT> > class basicjos:

В аргументах шаблона передается тип символов, используемый потоковыми классами, и класс с описанием трактовок этого типа.

В частности, трактовки класса определяют признак конца файла- и способы копирования/перемещения ряда символов. Как правило, тип символов ассоциируется с определенным набором трактовок, поэтому будет вполне логично определить шаблонный класс, специализируемый для конкретных типов символов.

На самом деле они не делают даже этого! Форматирование поручается соответствующим фацетам библиотеки локального контекста. Дополнительная информация о фацетах приведена иа с. 670 и 676.

Термин «конец файла» в данном контексте означает «конец входных даШых», что соответствует интерпретации константы EOF в языке С,



Соответственно но умолчанию используется класс трактовок char traits<charT>, где charT - тип символов. Стандартная библиотека С++ содержит специа.т1иза-цни шаблона char traits для типов символов char и wchar t. За дополнительной информацией о трактовках символов обращайтесь к с. 659.

Существуют две специализации класса basicjoso для двух самых распространенных типов символов:

namespace std {

typedef bas1c 1os<char> 1os: typedef basic 1os<wchar t> wios;

Тип ios соответствует базовому классу «старой» библиотеки lOStream, разработанной AT&T, и может использоваться для обеспечения совместимости со старыми программами С++.

Класс потокового буфера, используемый basicjos, определяется аналогично;

namespace std {

template <class charT.

class traits = char traits<charT> > class basic streambuf; typedef bas1c streambuf<char> streambuf; typedef basic streambuf<wchar t> wstreambuf;

Конечно, шаблоны basicjstreamo, basic ostream<> и basic iostream<> тоже параметризуются по типу символов и классу трактовок:

namespace std {

template <class charT,

class traits = char traits<charT> > class basic istream;

template <class charT,

class traits = char traits<charT> > class bas1c ostream:

template <class charT.

class traits = char traits<charT> >

class basic iostream:

По аналогии с другими классами также существуют спещтализации для двух важнейший типов символов:

namespace std {

typedef bas1c 1stream<char> istream; typedef basic istream<wchar t> wistream;

typedef basic istream<char> ostream; typedef basic 1stream<wchar t> wostream;



typedef basic istream<char> lost ream: typedef bas1c 1stream<wchar t> wiostream:

В западном полушарии обычно используются типы istream и ostream, в целом совместимые со «старыми» потоковыми классами AT&T.

Классы istream witliassign, ostream withassign и iostream witliassign, включенные в некоторые старые потоковые библиотеки (и производные от istream, ostream и iostream соответственно), не поддерживаются стандартом. Их функциональность реализуется другими средствами (см. с. 615).

Также в библиотеку lOStream входят дополнительные классы для выполнения форматированного ввода-вывода при работе с файлами и строками. Эти классы рассматриваются на с. 602 и 619.

Глобальные потоковые объекты

Для потоковых классов определен ряд глобальных потоковых объектов, предназначенных для работы со стандартными каналами ввода-вывода (табл. 13.2). Эти объекты упоминались выше при описании потоков данных с типом символов char, однако аналогичные объекты также определены для потоков данных с типом символов wchar t.

Таблица 13.2. Глобальные потоковые объекты

Назначение

istream

Читает данные из стандартного канала ввода

ostream

cout

Записывает «нормальные» данные в стандартный канал вывода

ostream

cerr

Записывает сообщения об ошибках в стандартный канал вывода ошибок

ostream

clog

Записывает журнальные данные в стандартный канал вывода журнала

wistream

wcin

Читает данные с расширенной кодировкой символов из стандартного канала ввода

wostream

wcout

Записывает «нормальные» данные с расширенной кодировкой символов в стандартный канал вывода

wostream

wcerr

Записывает сообщения об ошибках с расширенной кодировкой символов в стандартный канал вывода ошибок

wostream

wclog

Записывает журнальные данные с расширенной кодировкой символов в стандартный канал вывода журнала

По умолчанию эти стандартные потоки данных синхронизируются со стандартными потоками данных С. Иначе говоря, стандартная библиотека С++ гарантирует сохранение порядка вывода при смешанном нснользовании потоков данных С и С++. Перед выводом все буферы стандартных потоков данных С++ очищают буферы соответствующих потоков данных С, и наоборот. Разумеется, синхронизация требует дополнительного времени. Если она не нужна, отключите ее вызовом sync with stdio(false) перед первой операцией ввода-вывода (см. с. 654).



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 [ 182 ] 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239