В этой таблице перечислены флаги форматирования.
Флаг | Числовое значение | Назначение | Действие |
ios:: skipws | Отменяет ввод из потока лидирующих пробельных символов (пробелов, символов табуляции, символов перевода строки). Установлен по умолчанию. | ввод | |
ios:: unitbuf | Если буфер вывода не пуст, его содержимое передаются на устройство вывода сразу при завершении операции вывода. | вывод | |
ios:: uppercase | Отображает шестнадцатеричные цифры и символ экспоненты при выводе вещественных значений в верхнем регистре. | вывод | |
ios:: showbase | Отображает обозначение основания системы счисления, в которой выводится числовое значение. Например, если выводится значение A1F, то оно будет выведено в виде 0xA1F. | вывод | |
ios:: showpoint | Отображает при выводе вещественных значений десятичную точку и нули дробной части, даже если дробная часть отсутствует. | вывод | |
ios:: showpos | Приводит к отображению знака + при выводе положительных числовых значений. | вывод | |
ios:: left | Выравнивает вывод данных по левому краю поля вывода, дополняя данные справа пробелами (или установленными символами) до ширины поля вывода. | вывод | |
ios:: right | Выравнивает вывод данных по правому краю поля вывода, дополняя данные слева пробелами (или установленными символами) до ширины поля вывода | вывод | |
ios:: internal | Выводит знак числа с левым выравниванием, а само число с правым выравниванием. Между знаком и самим числом выводятся либо пробелы, либо установленные символы заполнения, дополняя выводимое значение до ширины поля вывода. | вывод | |
ios:: dec | Устанавливает десятичную форму представления целых чисел. Флаг установлен по умолчанию. | ввод/вывод | |
ios:: oct | Устанавливает восьмеричную форму представления целых чисел. | ввод/вывод | |
ios:: hex | Устанавливает шестнадцатеричную форму представления целых чисел. | ввод/вывод | |
ios:: scientific | Устанавливает формат вывода вещественных значений в формате с экспонентой. По умолчанию компилятор сам выбирает формат вывода (либо экспоненциальный, либо фиксированный). | вывод | |
ios:: fixed | Устанавливает формат вывода вещественных значений с фиксированной точкой. По умолчанию компилятор сам выбирает формат вывода (либо экспоненциальный, либо фиксированный). | вывод | |
ios:: boolalpha | По умолчанию логические значения представляются в виде 0 и 1. При установке этого флага эти значения представляются словами false и true. | ввод/вывод |
Замечания:
1. Приставка ios:: указывает на то, что определение флага принадлежит классу ios, опускать ее не следует, иначе компилятор выдаст ошибку.
2. Некоторые компиляторы (старые) могут не воспринимать представления этих флагов в виде идентификаторов. В этом случае необходимо использовать их числовые эквиваленты.
3. По сути, каждый флаг можно рассматривать как целочисленную именованную константу. Все эти константы определены в классе ios.
Флаги работают как переключатели (включен - выключен, установлен - сброшен). Все флаги упакованы в одном целом значении типа long int. Это целое значение определяет общее состояние всех флагов потока. Каждый флаг в этом целом значении представлен 1 битом (1 двоичным разрядом). Установленному флагу соответствует значение 1 некоторого двоичного разряда. Если флаг сброшен (отключен), соответствующий двоичный разряд равен 0. Например, если значение состояния всех флагов равно 68, то установлены флаги uppercase и left:
Номер разряда: 31 30 … 8 7 6 5 4 3 2 1 0
Состояния флагов: 0 0 … 0 0 1 0 0 0 1 0 0 = 68
Такое представление флагов позволяет, кроме компактной формы хранения, обеспечить эффективное управление флагами на основе использования побитовых логических операций.
Для управления флагами используются три функции: flags, setf и unsetf. Эти функции являются членами потоковых классов cout и cin, поэтому обращаться к ним следует через идентификаторы соответствующих потоковых классов: cout.flags, cout.setf, cout.unsetf или cin.flags, cin.setf, cin.unsetf. Если необходимо управлять флагами потока вывода, используется класс cout, если флагами потока ввода - класс cin. Все эти функции возвращают предыдущее состояние флагов.
Функция flags может использоваться двумя способами. Если вызвать ее без параметров, то она не изменяет состояние флагов, а только возвращает значение состояния всех флагов потока. Например, строка
cout << cin.flags () << endl;
выведет на экран целое значение соответствующее состоянию флагов потока ввода. А строка
cout << cout.flags () << endl;
выведет на экран целое значение соответствующее состоянию флагов потока вывода.
Эту функцию можно использовать и для изменения состояния флагов. Для этого при ее вызове в качестве параметра ей необходимо передать необходимое значение флага (флагов). Например, оператор cout.flags(ios::hex); установит флаг hex, все остальные флаги будут сброшены.
Особенностью этой функции является то, что она сначала сбрасывает все флаги, а уже потом устанавливает флаг (флаги), заданный параметром.
Замечание. Если вызвать функцию следующим образом: flags(0), то будут сброшены все флаги соответствующего потока.
Функция setf также служит для установки флагов. Она добавляет новый флаг (флаги) без изменения всех остальных.
/* 1 */ cout.flags(0); // Отключены все флаги
/* 2 */ cout.setf(ios:: showpos); // Установлен единственный флаг showpos
/* 3 */ cout.setf(ios:: hex); // Установлены два флага - showpos и hex
Если требуется сбросить флаг (флаги), используют функцию unsetf. В качестве параметра используется значение флага (флагов), который необходимо отключить. При этом остальные флаги изменены не будут. Например, если добавить к предыдущим строкам программы строку:
/* 4 */ cout.unsetf(ios:: showpos);
флаг showpos будет отключен, и останется установленным только флаг hex.
При использовании этих процедур можно оперировать не одиночными флагами, а объединением нескольких флагов. Например, строки 2 и 3 можно заменить одной строкой:
cout.setf (ios:: showpos | ios:: hex);
Объединение флагов осуществляется с помощью операции | - арифметическое ИЛИ.
Рассмотрим некоторые примеры использования флагов форматирования.
#include <iostream>
using namespace std;
int main ()
{
setlocale (0, "");
cout << 255 << endl; // На экране видим 255 - по умолчанию установлен флаг dec
cout.setf (ios:: hex); // Включаем флаг hex - хотим видеть на экране ff
cout << 255 << endl; // На экране видим 255 - изменений не произошло
system ("Pause");
return 0;
}
В этом примере установка флага hex не привела ни к каким изменениям. Причиной этого явилось то, что одновременно с установленным флагом hex остался установленным и флаг dec. Для исправления ситуации необходимо сначала отключить флаг dec, а затем уже установить флаг hex:
cout.unsetf (ios:: dec); // Отключаем флаг dec
cout.setf (ios:: hex); // Включаем флаг hex - хотим видеть на экране ff
cout << 255 << endl; // На экране видим ff - то, что хотели
Среди всех флагов можно выделить три группы, в каждой из которых флаги управляют одной и той же характеристикой ввода / вывода, но являются взаимоисключающими. Флагам каждой из этих групп в классе ios присвоены обобщающие имена:
Группа | Флаги | Обобщающее имя |
Флаги основания систем счисления | dec, oct, hex | basefield |
Флаги выравнивания | left, right, internal | adjustfield |
Флаги формата вещественных значений | scientific, fixed | floatfield |
Обобщающие имена групп удобно использовать для выполнения операции со всеми флагами группы, например, для сброса всех флагов группы:
cout.unsetf (ios:: basefield ); // Отключаем флаги dec , oct , hex за один прем
Более того, функцию setf можно использовать с двумя параметрами:
setf ( новые флаги, маска )
В этом случае функция setf устанавливает только те флаги, которые одновременно присутствуют и в первом и во втором параметре, а те флаги, которые присутствуют во втором параметре, но отсутствуют в первом, будут сброшены. Это дает возможность отключать и включать флаги за один вызов функции setf. Например, для установки любого флага из группы basefield достаточно использовать всего один оператор:
cout.setf (ios:: hex, ios:: basefield);
Здесь второй параметр содержит три флага: dec , oct , hex . Первый параметр содержит флаг hex. Этот флаг будет установлен, а флаги dec и oct будут сброшены.
В классе cout имеются еще несколько функций управляющих форматом вывода данных. К ним относятся:
· precision - определяет точность представления вещественных значений;
· width - устанавливает ширину поля вывода;
· fill - определяет символ заполнения при выводе данных.
Примеры использования этих функций
Пример 1.
cout.width (10); //Ширина поля вывода 10 позиций
cout << 123 << endl; // На экран выведено 7 пробелов и число 123
cout.fill (‘.’); // Символ заполнения ‘.’
cout.width (10); //Ширина поля вывода 10 позиций
cout << 123 << endl; // На экран выведено …….123
Пример 2
cout.width (10); //Ширина поля вывода 10 позиций
cout.setf (ios:: fixed); //Вывод вещественных значений с фиксированной точкой
cout.precision (3); //Ширина поля вывода 10 позиций
cout << 1.2345 << endl; // На экран выведено 7 пробелов и число 1.234
cout.fill (‘.’); // Символ заполнения ‘.’
cout.width (10); //Ширина поля вывода 10 позиций
cout << 123 << endl; // На экран выведено …….123