citystate = "Tucson, AZ";
cout << left // Каждое поле выравнивается влево.
<< setw(width) << first // Затем для каждого поля
<< setw(width) << last // устанавливается его ширина и
// записываются некоторые данные
<< setw(width) << citystate << endl;
cout.flags(flags);
}
Вывод выглядит следующим образом.
Richard Stevens Tucson, AZ
Манипулятор — это функция, которая выполняет некоторую операцию над потоком. Применяемые к потоку манипуляторы задаются в операторе operator<<
. Формат потока (ввода и вывода) задается набором флагов и установочных параметров конечного базового класса потока, ios_base
. Манипуляторы обеспечивают удобный способ настройки этих флагов и установочных параметров без явного использования для этой цели функций setf
или flags
, которые громоздки и воспринимаются с трудом. Для форматирования потока вывода лучше всего использовать манипуляторы.
В примере 10.1 используется два манипулятора для вывода текста в две колонки. Манипулятор setw
задает размер поля, a left
обеспечивает выравнивание влево находящегося в поле значения (дополнением манипулятора left
, что неудивительно, является right
). Когда вы используете слово «поле», вы просто говорите, что хотите дополнить заполнителем выдаваемое в поле значение с одной или с другой стороны, чтобы только ваше значение выводилось в этом поле. Если, как в примере 10.1, вы выравниваете значение влево и затем задаете размер поля, следующее записываемое в поток значение будет начинаться с первой позиции этого поля. Если переданные в поток данные имеют недостаточный размер и не могут заполнить все пространство поля, то правая часть поля будет дополнена символом заполнителя потока, которым по умолчанию является одиночный пробел. Вы можете изменить символ заполнителя с помощью манипулятора setfill
.
myostr << setfill('.') << "foo";
Если помещаемое в поле значение превышает его размер, будет напечатано все значение и никаких дополнительных символов выводиться не будет.
Табл. 10.1 содержит краткое описание манипуляторов, работающих с любыми типами значений (текстом, числами с плавающей точкой, целыми числами и т.д.). Имеется ряд манипуляторов, которые применяются только при выводе чисел с плавающей точкой — они описываются в рецепте 10.2.
Манипулятор | Описание | Пример вывода |
---|---|---|
left right | Выровнять значения в текущем поле вправо или влево, заполняя незанятое пространство символом-заполнителем | Выравнивание влево apple banana cherry Выравнивание вправо (ширина поля 10) apple banana cherry |
setw(int n) | Установить размер поля на n символов | См. предыдущий пример |
setfill(int с) | Использовать символ с для заполнения незанятого пространства поля | cout << setfill('.') << setw(10) << right << "foo" Выдает: .......foo |
boolalpha noboolalpha | Отобразить булевы значения в текущем локализованном представлении слов true и false , а не 1 и 0 | cout << boolalpha << true Выдает: true |
endl | Записать в поток символ новой строки (newline) и очистить буфер вывода | Нет |
ends | Записать в поток null-символ ('\0') | Нет |
flush | Очистить буфер вывода | Нет |
Некоторые представленные в табл. 10.1 (и в табл. 10.2 в следующем рецепте) манипуляторы переключают бинарные флаги потоков и в действительности реализуются как два манипулятора, которые включают и отключают флаг. Например, возьмем манипулятор boolalpha
. Если вы хотите, чтобы булевы значения отображались в соответствии с текущей локализацией (например, «true» и «false»), используйте манипулятор boolalpha
. Для отключения этого режима, чтобы вместо слов печатались 0 и 1, используйте манипулятор noboolalpha
(он используется по умолчанию).