Манипуляторы и форматирование ввода-вывода
Часто бывает необходимо вывести строку или число в определенном формате. Для этого используются так называемые манипуляторы.
Манипуляторы – это объекты особых типов, которые управляют тем, как ostream или istream обрабатывают последующие аргументы. Некоторые манипуляторы могут также выводить или вводить специальные символы.
С одним манипулятором мы уже сталкивались, это endl. Он вызывает вывод символа новой строки. Другие манипуляторы позволяют задавать формат вывода чисел:
endl | при выводе перейти на новую строку; |
ends | вывести нулевой байт (признак конца строки символов); |
flush | немедленно вывести и опустошить все промежуточные буферы; |
dec | выводить числа в десятичной системе (действует по умолчанию); |
oct | выводить числа в восьмеричной системе; |
hex | выводить числа в шестнадцатиричной системе счисления; |
setw (int n) | установить ширину поля вывода в n символов (n – целое число); |
setfill(int n) | установить символ-заполнитель; этим символом выводимое значение будет дополняться до необходимой ширины; |
setprecision(int n) | установить количество цифр после запятой при выводе вещественных чисел; |
setbase(int n) | установить систему счисления для вывода чисел; n может принимать значения 0, 2, 8, 10, 16, причем 0 означает систему счисления по умолчанию, т.е. 10. |
Использовать манипуляторы просто – их надо вывести в выходной поток. Предположим, мы хотим вывести одно и то же число в разных системах счисления:
int x = 53; cout "Десятичный вид: " dec x endl "Восьмиричный вид: " oct x endl "Шестнадцатиричный вид: " hex x endl
Аналогично используются манипуляторы с параметрами. Вывод числа с разным количеством цифр после запятой:
double x; // вывести число в поле общей шириной // 6 символов (3 цифры до запятой, // десятичная точка и 2 цифры после запятой) cout setw(6) setprecision(2) x endl;
Те же манипуляторы (за исключением endl и ends могут использоваться и при вводе. В этом случае они описывают представление вводимых чисел. Кроме того, имеется манипулятор, работающий только при вводе, это ws. Данный манипулятор переключает вводимый поток в такой режим, при котором все пробелы (включая табуляцию, переводы строки, переводы каретки и переводы страницы) будут вводиться. По умолчанию эти символы воспринимаются как разделители между атрибутами ввода.
int x; // ввести шестнадцатиричное число cin hex x;