Возможность управлять вводом-выводом в С++, обеспечивают форматирующие функции-члены, флаги и манипуляторы. Флаги, функции и манипуляторы выполняют одну и туже задачу — задают определённый формат ввода/вывода информации в потоках. Ввод/вывод на экран/с экрана в С++ осуществляется с помощью операторов cin и cout соответственно, а значит манипуляторы форматирования используются совместно с данными операторами ввода/вывода. Различие между функциями флагами и манипуляторами форматирования состоит в способе их применения. Теперь рассмотрим способы применения объектов форматирования.
//Основные форматирующие функции-члены:
cout.fill('/*symbol*/'); // устанавливает символ заполнитель
// где symbol - символ заполнитель, символ передаётся в одинарных кавычках
cout.width(/*width_field*/); // задает ширину поля
// где width_field - количество позиций(одна позиция вмещает один символ)
cout.precision(/*number*/); // задает количество знаков после десятичной точки
// где number - количество знаков после десятичной точки
Доступ к функциям осуществляется через операцию точка, а в круглых скобочках передаётся аргумент. Аргумент функции fill() может передаваться в виде символа, обрамленного одинарными кавычками, или в виде числа(код символа). Одних функций не достаточно для форматирования потоков ввода/вывода, поэтому в С++ предусмотрен ещё один способ форматирования — флаги.
Флаги форматирования позволяют включить или выключить один из параметров ввода/вывода. Чтобы установить флаг ввода/вывода, необходимо вызвать функцию setf(), если необходимо отключить флаг вывода, то используется функция unsetf(). Далее показаны конструкции установки и снятия флагов вывода.
// установка флага вывода cout.setf( ios::/*name_flag*/ ); // где name_flag - это имя флага
Доступ к функциям оператора вывода выполняется через операцию точка. Метод setf() принимает один аргумент — имя флага. Флаги вывода объявлены в классе ios, поэтому, перед тем, как обратиться к флагу, необходимо написать имя класса — ios, после которого, с помощью операции разрешения области действия, вызвать нужный флаг.
// снятие флага вывода cout.unsetf( ios::/*name_flag*/ ); // где name_flag - это имя флага
Если при вводе/выводе необходимо установить(снять) несколько флагов, то можно воспользоваться поразрядной логической операцией ИЛИ |. В этом случае конструкция языка C++ будет такой:
// установка нескольких флагов cout.setf( ios::/*name_flag1*/ | ios::/*name_flag2*/ | ios::/*name_flag_n*/ ); // снятие нескольких флагов cout.unsetf( ios::/*name_flag1*/ | ios::/*name_flag2*/ | ios::/*name_flag_n*/ );
В таблице 1 подробно описаны основные флаги форматирования, а также показаны примеры использования флагов.
| Флаг | Назначение | Пример | Результат |
|---|---|---|---|
| boolalpha |
Вывод логических величин в текстовом виде (
true, false) |
cout.setf(ios::boolalpha);
bool log_false = 0,
log_true = 1;
cout << log_false << endl
<< log_true << endl;
|
false true |
| oct |
Ввод/вывод величин в
восьмеричной системе счисления (сначала снимаем флаг
dec, затем устанавливаем флаг oct) |
cout.unsetf(ios::dec);
cout.setf(ios::oct);
int value;
cin >> value;
cout << value << endl;
|
ввод:9910 вывод:1438 |
| dec |
Ввод/вывод величин в десятичной системе счисления (флаг установлен по умолчанию)
|
cout.setf(ios::dec);
int value = 148;
cout << value << endl;
|
148 |
| hex |
Ввод/вывод величин в шестнадцатеричной системе счисления (сначала снимаем флаг
dec, затем устанавливаем флаг hex) |
cout.unsetf(ios::dec);
cout.setf(ios::hex);
int value;
cin >> value;
cout << value << endl;
|
ввод:9910 вывод:6316 |
| showbase |
Выводить индикатор основания системы счисления
|
cout.unsetf(ios::dec);
cout.setf(ios::oct | ios::showbase);
int value;
cin >> value;
cout << value << endl;
|
ввод:9910 вывод:01438 |
| uppercase | В шестнадцатеричной системе счисления использовать буквы верхнего регистра(по умолчанию установлены буквы нижнего регистра) |
cout.unsetf(ios::dec);
cout.setf(ios::hex | ios::uppercase);
int value;
cin >> value;
cout << value << endl;
|
ввод:25510 вывод:FF16 |
| showpos | Вывод знака плюс + для положительных чисел |
cout.setf(ios::showpos);
int value = 15;
cout << value << endl;
|
+15 |
| scientific | Вывод чисел с плавающей точкой в экспоненциальной форме |
cout.setf(ios::scientific);
double value = 1024.165;
cout << value << endl;
|
1.024165e+003 |
| fixed | Вывод чисел с плавающей точкой в фиксированной форме(по умолчанию) |
double value = 1024.165;
cout << value << endl;
|
1024.165 |
| right | Выравнивание по правой границе(по умолчанию). Сначала необходимо установить ширину поля(ширина поля должна быть заведомо большей чем, длина выводимой строки). |
cout.width(40);
cout << «cppstudio.com» << endl;
|
__cppstudio.com |
| left | Выравнивание по левой границе. Сначала необходимо установить ширину поля(ширина поля должна быть заведомо большей чем, длина выводимой строки). |
cout.setf(ios::left);
cout.width(40);
cout << «cppstudio.com» << endl;
|
cppstudio.com__ |
| Манипулятор | Назначение | Пример | Результат |
|---|---|---|---|
| endl | Переход на новую строку при выводе | cout << «website:» << endl << «cppstudio.com»; | website: cppstudio.com |
| boolalpha |
Вывод логических
величин в текстовом
виде (
true, false) |
bool log_true = 1;
cout << boolalpha << log_true << endl;
|
true |
| noboolalpha |
Вывод логических
величин в числовом
виде (
true, false) |
bool log_true = true;
cout << noboolalpha << log_true << endl;
|
1 |
| oct |
Вывод величин в
восьмеричной
системе счисления
|
int value = 64;
cout << oct << value << endl;
|
1008 |
| dec |
Вывод величин в
десятичной системе
счисления (по умолчанию)
|
int value = 64;
cout << dec << value << endl;
|
6410 |
| hex |
Вывод величин в
шестнадцатеричной
системе счисления
|
int value = 64;
cout << hex << value << endl;
|
408 |
| showbase |
Выводить индикатор
основания системы
счисления
|
int value = 64;
cout << showbase << hex << value << endl;
|
0x40 |
| noshowbase |
Не выводить индикатор
основания системы
счисления (по умолчанию).
|
int value = 64;
cout << noshowbase << hex << value << endl;
|
40 |
| uppercase | В шестнадцатеричной системе счисления использовать буквы верхнего регистра (по умолчанию установлены буквы нижнего регистра). |
int value = 255;
cout << uppercase << hex << value << endl;
|
FF16 |
| nouppercase | В шестнадцатеричной системе счисления использовать буквы нижнего регистра (по умолчанию). |
int value = 255;
cout << nouppercase << hex << value << endl;
|
ff16 |
| showpos | Вывод знака плюс + для положительных чисел |
int value = 255;
cout << showpos<< value << endl;
|
+255 |
| noshowpos | Не выводить знак плюс + для положительных чисел (по умолчанию). |
int value = 255;
cout <<noshowpos<< value << endl;
|
255 |
| scientific | Вывод чисел с плавающей точкой в экспоненциальной форме |
double value = 1024.165;
cout << scientific << value << endl;
|
1.024165e+003 |
| fixed | Вывод чисел с плавающей точкой в фиксированной форме (по умолчанию). |
double value = 1024.165;
cout << fixed << value << endl;
|
1024.165 |
| setw(int number) | Установить ширину поля, где number — количество позиций, символов (выравнивание по умолчанию по правой границе). Манипулятор с параметром. |
cout << setw(40) << «cppstudio.com» << endl; | __cppstudio.com |
| right | Выравнивание по правой границе(по умолчанию). Сначала необходимо установить ширину поля(ширина поля должна быть заведомо большей чем, длина выводимой строки). |
cout << setw(40) << right << «cppstudio.com» << endl;
|
__cppstudio.com |
| left | Выравнивание по левой границе. Сначала необходимо установить ширину поля(ширина поля должна быть заведомо большей чем, длина выводимой строки). |
cout << setw(40) << left << «cppstudio.com» << endl;
|
cppstudio.com__ |
| setprecision(int count) | Задаёт количество знаков после запятой, где count — количество знаков после десятичной точки |
cout << fixed << setprecision(3) << (13.5 / 2) << endl; | 6.750 |
| setfill(int symbol) | Установить символ заполнитель. Если ширина поля больше, чем выводимая величина, то свободные места поля будут наполняться символом symbol — символ заполнитель |
cout << setfill(‘0′) << setw(4) << 15 << ends << endl; | 0015 |
Форматированный ввод/вывод в С++ это одна из самых простых тем в программировании. Как использовать те или иные средства форматирования показано в таблицах, поэтому затруднений по данной теме возникнуть не должно.
Комментарии
zybr zybr
хорошая статья!
Kto To
rajul1431
Здравствуйте! )
Извините за такой вопрос, когда я написал этот код для решения одной из задач:
#include <iostream> using namespace std; int main() { int a; cout << "Vvedite chislo" << endl; cin >> a; cout << hex << "chislo v shesnadceterichnom vide: "<< a << endl; return 0; }И когда вместо числа написал 55, в ответе было 37,
А когда исправил на этот:
#include <iostream> using namespace std; int main() { int a; cout << "Vvedite chislo" << endl; cout.setf(ios::showbase); cin >> a; cout << hex << "chislo v shesnadceterichnom vide: "<< a << endl; return 0; }то ответ был 0х37, какая между ними разница?
Компилятор Code::Blocks.
n196184611
Почему установку/снятие нескольких флагов нужно разделять поразрядной ИЛИ (|) — просто такой принятый синтаксис, или как-то связано с битовыми вычислениями?
(чтобы лучше понять и запомнить)
Chi
Учусь. Узнал что-то новое. Спасибо большое.
В таблице «Манипуляторы» setfill(int symbol) неправильно указан тип параметра http://www.cplusplus.com/reference/iomanip/setfill/
1lena
День добрый. Почему в примере с флагами, флаг fixed записан так:
double value = 1024.165;
cout << value << endl;
а не так
cout.setf(ios::fixed);
double value = 1024.165;
cout << value << endl;
и соответственно флаг right?
NaikoN
В примере с манипулятором hex, в строке: cout << dec << value << endl;, нужно dec заменит на hex и тогда все будет правильно, т. е. cout << hex << value << endl;
admin
Сделал