Анимация
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

Принудительный вывод выходного буфера strm.flushO:

Возвращение strm для организации целочечных вызовов return strm:

Манипулятор используется в выражениях вида

std::COUt « Std::endl:

Для потока данных cout вызывается оператор <<, которому во втором операнде передается функция endl(). Реализация оператора << преобразует этот вызов в вызов переданной функции, которой в качестве аргумента передается объект потока данных:

std:;endl(std::cout)

Чтобы добиться эффекта «вывода*- манипулятора, можно просто использовать это выражение. Более того, у функциональной записи есть свои преимущества - она не требует указания пространства имен:

endl(std;:cout)

Это возможно благодаря тому, что функции ищутся в том пространстве имен, в котором определены их аргументы (см. с. 33).

Поскольку потоковые классы оформлены в виде шаблонов, параметризованных по типу символов, настоящая реализация endl() выглядит примерно так:

tempiate<class charT. class tra1ts>

std; ;basic ostream<charT.tra1ts>&

std;;endl (std::basic ostream<charT.tra1ts>& strm)

strm.put(strm.widen(\n));

strm.flushO;

return strm;

Функция widen() преобразует символ новой строки к кодировке, используемой в потоке данных. За подробностями обращайтесь к с. 601.

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

Стандартные параметризованные манипуляторы определяются в заголовочном файле <iomanip>. Если вы собираетесь использовать их, в программу необходимо включить соответствующий файл;

#1nclude <1omanip>

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



Пользовательские манипуляторы

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

io/ignore.hpp #1nclude <istredm> #1nclude <lirn1ts>

template <class charT. class tra1ts> Inline

std::basic istream<charT.tra1ts>&

ignoreHne (std: :basic istream<charT.tralts>& strm)

Пропуск символов до конца строки

strm.ignore(std::numeric limits<int>::max().strm.w1den(\n)):

Возвращение strm для организации цепочечных вызовов return strm;

Манипулятор просто поручает работу функции ignore(), которая игнорирует все символы до конца строки (функция ignore() описана на с. 584). Применение манипулятора выглядит очень просто:

Пропустить символы до конца строки std;;с1п » ignoreLine;

Многократный вывод манипулятора позволяет проигнорировать сразу несколько строк:

Пропустить две строки

std:;Cln » IgnoreLine » ignoreLine;

Такая конструкция работает, поскольку вызов функции ignore(max, с) означает пропуск всех символов, пока не обнаружится символ с во входном потоке данных (или пока не будет прочитано максимальное количество символов, или пока не будет достигнут конец потока данных). Но этот символ также пропускается перед возвращенцем из функции.

Форматирование

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



Здесь представлены форматные флаги, а аспекты форматирования, относящиеся к интернационализации программ, описаны на с. 601 и в главе 14.

Форматные флаги

Класс ios base содержит ряд переменных, предназначенных для определения форматов ввода-вывода. В частности, эти переменные определяют минимальную ширину поля, точность вывода вещественных чисел и заполнитель. Переменная типа ios::fmtflags содержит флаги конфигурации, которые определяют, нужно ли выводить знак перед положительными числами, должны ли логические значения выводиться в числовом или в символьном виде, и т. д.

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

В табл. 13.9 перечислены функции, предназначенные для работы со всеми определениями форматов для потоков данных.

Таблица 13.9. Название таблицы Функция Описание

5е1Г(флаги) Устанавливает флаги, переданные в аргументе, в качестве

дополнительных форматных флагов и возвращает предыдущее состояние всех флагов

5е1Г(флаги, маска) Устанавливает флаги, переданные в первом аргументе, в качестве новых форматных флагов для группы, которая идентифицируется маской, переданной во втором аргументе, и возвращает предыдущее состояние всех флагов

ип5е11Хфлаги) Сбрасывает флаги, переданные в арг/менте

flags() Возвращает весь набор форматных флагов

Лад5(флаги) Устанавливает флаги, переданные в аргументе, в качестве новых

форматных флагов и возвращает предыдущее состояние всех флагов

сору(поток) Копирует все определения форматов из потока, переданного в аргументе

Функции setf() и unsetf() соответственно устанавливают и сбрасывают один или несколько флагов. Чтобы операция выполнялась сразу с несколькими флагами, следует объединить их оператором (поразрядная дизъюнкция). Во втором аргументе функции setf() может передаваться маска, по которой сбрасываются все флаги группы перед установкой флагов, передаваемых в первом аргументе (и также офаниченных группой). Такая возможность не поддерживается версией setf(), вызываемой с одним аргументам. Пример:

Установка флагов showpos и uppercase

std::cout.setf (std::1os::showpos std::1os::uppercase):

Установка только флага hex в группе basefield std:-.cout.setf (std: ;ios: :hex. std: :1os: :basef1eld);



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