![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Использование флагов форматирования.
В этой таблице перечислены флаги форматирования.
Замечания: 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>
|