Форматированный ввод/вывод в С++

Возможность управлять вводом-выводом в С++, обеспечивают форматирующие функции-члены, флаги и манипуляторы. Флаги, функции и манипуляторы выполняют одну и туже задачу — задают определённый формат ввода/вывода информации в потоках. Ввод/вывод на экран/с экрана в С++ осуществляется с помощью операторов 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 подробно описаны основные флаги форматирования, а также показаны примеры использования флагов.

Таблица 1 — Флаги форматирования в С++
Флаг Назначение Пример Результат
boolalpha
Вывод   логических величин в текстовом виде (truefalse)
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__

Ещё один способ форматирования — форматирование с помощью манипуляторов. Манипулятор — объект особого типа, который управляет потоками ввода/вывода, для форматирования передаваемой в потоки информации. Отчасти манипуляторы дополняют функционал, для форматирования ввода/вывода. Но большинство манипуляторов выполняют точно, то же самое, что и функции с флагами форматирования. Есть случаи, когда проще пользоваться флагами или функциями форматирования, а иногда удобнее использовать манипуляторы форматирования. Именно по этому в С++ предусмотрено несколько средств форматирования ввода/вывода. В таблице 2 показаны основные манипуляторы форматирования С++.
Таблица 2 — Манипуляторы форматирования в С++
Манипулятор Назначение Пример Результат
endl Переход на новую строку при выводе cout << «website:» << endl << «cppstudio.com»; website:
cppstudio.com
boolalpha
Вывод   логических
величин в текстовом
виде (truefalse)
  bool log_true = 1;
cout << boolalpha << log_true << endl;
true
noboolalpha
Вывод   логических
величин в числовом
виде (truefalse)
 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

Форматированный ввод/вывод в С++ это одна из самых простых тем в программировании. Как использовать те или иные средства форматирования показано в таблицах, поэтому затруднений по данной теме возникнуть не должно.

Автор: admin
Дата: 25.08.2012
Поделиться:

Комментарии

  1. rajul1431

    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.

  2. n196184611

    n196184611

    Почему установку/снятие нескольких флагов нужно разделять поразрядной ИЛИ (|) — просто такой принятый синтаксис, или как-то связано с битовыми вычислениями?

    (чтобы лучше понять и запомнить)

  3. Chi

    Учусь. Узнал что-то новое. Спасибо большое.

    В таблице «Манипуляторы» setfill(int symbol) неправильно указан тип параметра  http://www.cplusplus.com/reference/iomanip/setfill/

  4. 1lena

    День добрый. Почему в примере с флагами, флаг fixed записан так:
    double value = 1024.165;
    cout << value << endl;
    а не так
    cout.setf(ios::fixed);

    double value = 1024.165;
    cout << value << endl;
    и соответственно флаг right?

  5. NaikoN

    В примере с манипулятором hex, в строке: cout << dec << value << endl;, нужно  dec заменит на hex и тогда все будет правильно, т. е. cout << hex << value << endl;

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.