Использование флагов форматирования.
В этой таблице перечислены флаги форматирования.
Флаг | Числовое значение | Назначение | Действие |
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>
Дата добавления: 2019-02-07; просмотров: 298;