" установлен 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;