// вставляет нулевой символ, затем сбрасывает буфер
char ch[2]; ch[0] = 'a'; ch[1] = 'b';
cout ch ends;
// вставляет символ новой строки, затем сбрасывает буфер
cout "hi!" endl;
* при установлении внутренней переменной состояния потока unitbuf буфер сбрасывается после каждой операции вывода;
* объект ostream может быть связан (tied) с объектом istream. Тогда буфер ostream сбрасывается каждый раз, когда istream читает из входного потока. cout всегда связан с cin:
cin.tie( &cout );
Инструкция
cin ival;
приводит к сбросу буфера 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 "ival: " setw(12) ival '\n'
"dval: " setw(12) dval '\n';
}
печатает:
ival: 16
dval: 3.14159
Второй модификатор setw() необходим потому, что, в отличие от других манипуляторов, setw() не изменяет состояние формата объекта ostream.
Чтобы выровнять значение по левой границе, мы применяем манипулятор left (соответственно манипулятор right восстанавливает выравнивание по правой границе). Если мы хотим получить такой результат:
16
- 3
то пользуемся манипулятором internal, который выравнивает знак по левой границе, а значение – по правой, заполняя пустое пространство пробелами. Если же нужен другой символ, то можно применить манипулятор setfill(). Так
cout setw(6) setfill('%') 100 endl;
печатает:
%%%100
В табл. 20.1 приведен полный перечень предопределенных манипуляторов.
Таблица 20.1. Манипуляторы