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.

Табл. 10.1. Текстовые манипуляторы

МанипуляторОписаниеПример вывода
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 и 0cout << boolalpha << true Выдает: true
endlЗаписать в поток символ новой строки (newline) и очистить буфер выводаНет
endsЗаписать в поток null-символ ('\0')Нет
flushОчистить буфер выводаНет

Некоторые представленные в табл. 10.1 (и в табл. 10.2 в следующем рецепте) манипуляторы переключают бинарные флаги потоков и в действительности реализуются как два манипулятора, которые включают и отключают флаг. Например, возьмем манипулятор boolalpha. Если вы хотите, чтобы булевы значения отображались в соответствии с текущей локализацией (например, «true» и «false»), используйте манипулятор boolalpha. Для отключения этого режима, чтобы вместо слов печатались 0 и 1, используйте манипулятор noboolalpha (он используется по умолчанию).

Перейти на страницу:

Похожие книги