В этом уроке мы вернемся к используемым ранее операторам cin и cout для рассмотрения их в организации форматированного ввода-вывода. Для управления вводом-выводом в C++
используются :
- флаги форматированного ввода-вывода;
- манипуляторы форматирования.
Флаги позволяют установить параметры ввода-вывода, которые будут действовать во всех последующих операторах ввода-вывода до тех пор, пока не будут отменены. Манипуляторы вставляются в операторы cin(cout) и устанавливают параметры текущего оператора ввода-вывода.
Использование флагов
Флаги позволяют включить или выключить один из параметров вывода на экран. Для установки флага вывода используется следующая конструкция языка C++:
cout.setf(ios::flag)
Для снятия флага конструкция:
cout.unsetf(ios::flag)
Здесь flag — имя конкретного флага.
Если при выводе необходимо установить несколько флагов, то можно воспользоваться арифметической операцией «или» (|). В этом случае конструкция языка C++ будет такой:
cout.setf(ios::flag1 | ios::flag2 | ios::flag3)
В данном случае flag1, flag2, flag3 — имена устанавливаемых флагов вывода. В таблице ниже приведены некоторые флаги форматного вывода с примерами их использования.
| Флаг | Описание | Пример использования | Результат |
| right | Выравнивание по правой границе | int r=–25; cout.setf(ios::right); cout.width(15); cout<<“r=”<<r<<endl;
| r=-25 |
| left | Выравнивание по левой границе (по умолчанию) | double r=–25.45; cout.setf(ios::left); cout.width(50); cout<<“r=”<<r<<endl;
| r=-25.45 |
| boolalpha | Вывод логических величин в текстовом виде | bool a=true; cout<<a<<endl; cout.setf(ios::boolalpha); cout<<a<<endl;
| 1 true |
| dec | Вывод величин в десятичной системе счисления (по умолчанию) | int r=–25; cout<<“r=”<<r<<endl;
| r=-25 |
| oct | Вывод величин в восьмеричной системе счисления (для этого нужно снять флаг вывод в десятичной) | int p=23; cout.unsetf(ios::dec); cout.setf(ios::oct); cout<<“p=”<<p<<endl;
| p=27 |
| hex | Вывод величин в шестнадцатеричной системе счисления (для этого нужно снять флаг вывод в десятичной) | int p=23; cout.unsetf(ios::dec); cout.setf(ios::hex); cout<<“p=”<<p<<endl;
| p=17 |
| showbase | Выводить индикатор основания системы счисления | int r=–25; cout.unsetf(ios::dec); cout.setf(ios::hex|ios::showbase); cout<<“p=”<<p<<endl;
| p=0x17 |
| uppercase | Использовать прописные буквы в шестнадцатеричных цифрах | int p=29; cout.unsetf(ios::dec); cout.setf(ios::hex|ios::uppercase); cout<<“p=”<<p<<endl;
| p=1D |
| showpos | Выводить знак + для положительных чисел | int p=29; cout.setf(ios::showpos); cout<<“p=”<<p<<endl;
| p=+29 |
| scientific | Экспоненциальная форма вывода вещественных чисел | double p=146.673; cout.setf(ios::scientific); cout<<“p=”<<p<<endl;
| p=1.466730e+002 |
| fixed | Фиксированная форма вывода вещественных чисел (по умолчанию) | double p=146.673; cout.setf(ios::fixed); cout<<“p=”<<p<<endl;
| p=146.673 |
Флаги удобно использовать в тех случаях, когда следует изменить параметры всех последующих операторов ввода-вывода. Использование большего количества флагов для управления одним оператором ввода-вывода не совсем удобно. Еще одним способом форматирования является использование манипуляторов непосредственно в операторах cin и cout.
Использование манипуляторов форматирования
Манипуляторы встраиваются непосредственно в операторы ввода-вывода. С одним из них (endl) вы уже знакомы. В таблице ниже приведены основные манипуляторы форматирования с примерами. Для корректного их использования необходимо подключить библиотеку iomanip с помощью оператора #include <iomanip>
| Манипулятор | Описание | Пример использования | Результат |
| setw(n) | Определяет ширину поля вывода в n символов | int r=–253; cout.setf(ios::fixed); cout<<“r=”<<setw(10)<<r<<endl;
| r=253 |
| setprecision(n) | Определяет количество цифр (n-1) в дробной части числа | double p=1234.6578; cout.setf(ios::fixed); cout<<“p=”<<setw(15)<<setprecision(3)<<p<<endl;
| p=1234.658 |
| left | Выравнивание по левой границе (по умолчанию) | int r=–25; cout.width(15); cout<<“r=”<<setw(15)<<left<<r<<endl;
| r=-25 |
| right | Выравнивание по правой границе | int r=–25; cout.width(15); cout<<“r=”<<setw(15)<<right<<r<<endl;
| r=-25 |
| boolalpha | Вывод логических величин в текстовом виде | bool a=true; cout<<boolalpha<<a<<endl;
| true |
| noboolalpha | Вывод логических величин в числовом виде | bool a=true; cout<<noboolalpha<<a<<endl;
| 1 |
| dec | Вывод величин в десятичной системе счисления (по умолчанию) | int r=0253; cout<<“r=”<<dec<<r<<endl;
| r=171 |
| oct | Вывод величин в восьмеричной системе счисления (для этого нужно снять флаг вывод в десятичной) | int r=253; cout<<“r=”<<oct<<r<<endl;
| r=375 |
| hex | Вывод величин в шестнадцатеричной системе счисления (для этого нужно снять флаг вывод в десятичной) | int r=253; cout<<“r=”<<hex<<r<<endl;
| r=fd |
| showbase | Выводить индикатор основания системы счисления | int p=253; cout<<“p=”<<hex<<uppercase<<showbase<<p<<endl;
| p=0XFD |
| noshowbase | Не выводить индикатор основания системы счисления | int p=253; cout<<“p=”<<hex<<nouppercase<<showbase<<p<<endl;
| p=FD |
| uppercase | Использовать прописные буквы в шестнадцатеричных цифрах | int p=253; cout<<“p=”<<hex<<uppercase<<p<<endl;
| p=FD |
| nouppercase | Использовать строчные буквы в шестнадцатеричных цифрах | int p=253; cout<<“p=”<<hex<<nouppercase<<p<<endl;
| p=fd |
| showpos | Выводить знак + для положительных чисел | int p=29; cout<<“p=”<<showpos<<p<<endl;
| p=+29 |
| noshowpos | Не выводить знак + для положительных чисел | int p=29; cout<<“p=”<<noshowpos<<p<<endl;
| p=29 |
| scientific | Экспоненциальная форма вывода вещественных чисел | double p=146.673; cout<<“p=”<<scientific<<p<<endl;
| p=1.466730e+002 |
| fixed | Фиксированная форма вывода вещественных чисел (по умолчанию) | cout<<“p=”<<fixed<<p<<endl;
| p=146.673 |
| setfill(c) | Установить символ c как заполнитель | cout<<“x=”<<right<<setw(10)<<setprecision(4)<<setfill(‘!’)<<(float) 1/7<<endl; cout<<“x=”<<left<<setw(10)<<setprecision(4)<<setfill(‘!’)<<(float) 1/7<<endl;
| x=!!!!0.1429 x=0.1429!!!! |
Другими способами управления шириной поля вывода с помощью операторов являются:
- cout.width(n) — устанавливает ширину поля вывода — n позиций;
- cout.presicion(m) — определяет m цифр в дробной части числа;
При использовании операторов cin и cout фактически происходит ввод-вывод в текстовый файл. При вводе текстовым файлом является клавиатура, а при выводе — экран дисплея. Cin и cout фактически являются именами потоков (о них мы поговорим в следующих уроках), которые отвечают за ввод и вывод в текстовый файл. Поэтому многие рассмотренные возможности форматированного ввода-вывода будут использоваться и при обработке текстовых файлов.


