Выбрать главу

приводит к сбросу буфера cout.

В любой момент времени объект ostream разрешено связывать только с одним объектом istream. Чтобы разорвать существующую связь, мы передаем функции-члену tie() значение 0:

istream is;

ostream new_os;

// ...

// tie() возвращает существующую связь

ostream *old_tie = is.tie();

is.tie( 0 ); // разорвать существующую связь

is.tie( &new_os ); // установить новую связь

// ...

is.tie( 0 ); // разорвать существующую связь

is.tie( old_tie ); // восстановить прежнюю связь

Мы можем управлять шириной поля, отведенного для печати числового или строкового значения, с помощью манипулятора setw(). Например, программа

#include iostream

#include iomanip

int main()

{

int ival = 16;

double dval = 3.14159;

cout "ivaclass="underline" " setw(12) ival '\n'

"dvaclass="underline" " setw(12) dval '\n';

}

печатает:

ivaclass="underline" 16

dvaclass="underline" 3.14159

Второй модификатор setw() необходим потому, что, в отличие от других манипуляторов, setw() не изменяет состояние формата объекта ostream.

Чтобы выровнять значение по левой границе, мы применяем манипулятор left (соответственно манипулятор right восстанавливает выравнивание по правой границе). Если мы хотим получить такой результат:

16

- 3

то пользуемся манипулятором internal, который выравнивает знак по левой границе, а значение – по правой, заполняя пустое пространство пробелами. Если же нужен другой символ, то можно применить манипулятор setfill(). Так

cout setw(6) setfill('%') 100 endl;

печатает:

%%%100

В табл. 20.1 приведен полный перечень предопределенных манипуляторов.

Таблица 20.1. Манипуляторы

Манипулятор

Назначение

boolalpha

Представлять true и false в виде строк

*noboolalpha

Представлять true и false как 1 и 0

Showbase

Печатать префикс, обозначающий систему счисления

*noshowbase

Не печатать префикс система: счисления

showpoint

Всегда печатать десятичную точку

*noshowpoint

Печатать десятичную точку только в том случае, если дробная часть ненулевая

showpos

Печатать + для неотрицательных чисел

*noshowpos

Не печатать + для неотрицательных чисел

*skipws

Пропускать пробельные символы в операторах ввода

noskipws

Не пропускать пробельные символы в операторах ввода

uppercase

Печатать 0X при выводе в шестнадцатеричной системе счисления; E - при выводе в научной нотации

*nouppercase

Печатать 0x при выводе в шестнадцатеричной системе счисления; e - при выводе в научной нотации

*dec

Печатать в десятичной системе

hex

Печатать в шестнадцатеричной системе

oct

Печатать в восьмеричной системе

left

Добавлять символ заполнения справа от значения

right

Добавлять символ заполнения слева от значения

internal

Добавлять символ заполнения между знаком и значением

*fixed

Отображать число с плавающей точкой в десятичной нотации

scientific

Отображать число с плавающей точкой в научной нотации

flush

Сбросить буфер ostream

ends

Вставить нулевой символ, затем сбросить буфер ostream

endl

Вставить символ новой строки, затем сбросить буфер ostream

ws

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

// для этих манипуляторов требуется #include ionamiip

setfill( ch )

Заполнять пустое место символом ch

Setprecision( n )

Установить точность вывода числа с плавающей точкой равной n

setw( w )

Установить ширину ноля ввода или вывода равной w

setbase( b )

Выводить целые числа по основанию b

* обозначает состояние потока но умолчанию

20.10. Сильно типизированная библиотека

Библиотека iostream сильно типизирована. Например, попытка прочитать из объекта класса ostream или записать в объект класса istream помечается компилятором как