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

" установлен hex: " hex dval "\n";

cout "ivaclass="underline" " ival

" установлен dec: " dec ival "\n";

cout noshowbase;

}

Результат:

ivaclass="underline" 16 установлен oct: 020

dvaclass="underline" 16 установлен hex: 16

ivaclass="underline" 0x10 установлен dec: 16

Манипулятор noshowbase восстанавливает состояние cout, при котором основание системы счисления не выводится.

По умолчанию значения с плавающей точкой выводятся с точностью 6. Эту величину можно модифицировать с помощью функции-члена precision(int) или манипулятора setprecision(); для использования последнего необходимо включить заголовочный файл iomanip. precision() возвращает текущее значение точности. Например:

#include iostream

#include iomanip

#include math.h

int main()

{

cout "Точность: "

cout.precision() endl

sqrt(2.0) endl;

cout.precision(12);

cout "\nТочность: "

cout.precision() endl

sqrt(2.0) endl;

cout "\nТочность:" setprecision(3)

cout.precision() endl

sqrt(2.0) endl;

return 0;

}

После компиляции и запуска программа печатает следующее:

Точность: 6

1.41421

Точность: 12

1.41421356237

Точность: 3

1.41

Манипуляторы, принимающие аргумент, такие, как setprecision() и setw(), требуют включения заголовочного файла iomanip:

#include iomanip

Кроме описанных аспектов, setprecision() имеет еще два: на целые значения он не оказывает никакого влияния; значения с плавающей точкой округляются, а не обрезаются. Таким образом, при точности 4 значение 3.14159 печатается как 3.142, а при точности 3 – как 3.14.

По умолчанию десятичная точка не печатается, если дробная часть значения равна 0. Например:

cout 10.00

выводит

10

Чтобы точка выводилась, воспользуйтесь манипулятором showpoint:

cout showpoint

10.0

noshowpoint '\n';

Манипулятор noshowpoint восстанавливает поведение по умолчанию.

По умолчанию значения с плавающей точкой выводятся в нотации с фиксированной точкой. Для перехода на научную нотацию используется идентификатор scientific, а для возврата к прежней нотации – модификатор fixed:

cout "научная: " scientific

10.0

"с фиксированной точкой: " fixed

10.0 '\n';

В результате печатается:

научная: 1.0e+01

с фиксированной точкой: 10

Если бы мы захотели вместо буквы 'e' выводить 'E', то следовало бы употребить манипулятор uppercase, а для возврата к 'e' – nouppercase. (Манипулятор uppercase не приводит к переводу букв в верхний регистр при печати.)

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

a bc

d

то цикл

char ch;

while ( cin ch )

// ...

читает все буквы от 'a' до 'd' за четыре итерации, а пробельные разделители оператором ввода игнорируются. Манипулятор noskipws отменяет такой пропуск пробельных символов:

char ch;

cin noskipws;

while ( cin ch )

// ...

cin skipws;

Теперь цикл while будет выполняться семь раз. Чтобы восстановить поведение по умолчанию, к потоку cin применяется манипулятор skipws.

Когда мы пишем:

cout "пожалуйста, введите значение: ";

* то в буфере потока cout сохраняется литеральная строка. Есть ряд условий, при которых буфер сбрасывается (т.е. опустошается), – в нашем случае в стандартный вывод: буфер может заполниться. Тогда перед чтением следующего значения его необходимо сбросить;

* буфер можно сбросить явно с помощью любого из манипуляторов flush, ends или endclass="underline"

// сбрасывает буфер

cout "hi!" flush;

// вставляет нулевой символ, затем сбрасывает буфер

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;