Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 36
Текст из файла (страница 36)
Однако основание системы счисления можно поменять. Установка флагаoct ведет к тому, что вывод будет осуществляться в восьмеричной системесчисления, а установка флага hex — в шестнадцатеричной. Чтобы вернутьсяк десятичной системе счисления, установите флаг dec.Установка флага showbase ведет к выводу основания системы счисления.Например, шестнадцатеричное значение IF с этим флагом будет выводитьсякак Ox IF.По умолчанию при выводе значений в научной нотации символ "е" выводится в нижнем регистре.
Кроме этого, при выводе шестнадцатеричногозначения символ "х" тоже выводится в нижнем регистре. При установкефлага uppercase, эти символы выводятся в верхнем регистре.Установка флага showpos приводит к выводу знака + перед положительнымизначениями.Установка флага showpoint ведет к появлению десятичной точки и последующих нулей при выводе любых значений с плавающей точкой.При установке флага scientific числа с плавающей точкой выводятся в научной нотации.
При установке флага fixed числа с плавающей точкой выводятся в обычной нотации. Если ни один из этих флагов не установлен,компилятор сам выбирает подходящий способ вывода.Если установлен флаг umtbuf, то буфер очищается (flush) после каждой операции вставки (insertion operation).При установленном флаге boolalpha значения булева типа выводятся в видеключевых слов true и false.Одновременно на все поля, определенные с флагами oct, dec и hex, можносослаться с помощью флага basefield.
Аналогично на поля, определенные сфлагами left, right и internal, можно сослаться с помощью флага adjust field Инаконец, на поля с флагами scientific и fixed можно сослаться с помощьюфлага floatfield.Для установки флага формата пользуйтесь функцией setf(). Эта функцияявляется членом класса ios. Здесь показана ее основная форма:fratflags setf(fmtflagsфлаги);Эта функция возвращает предыдущие установки флагов формата и устанавливает новые, заданные значением флаги.
(Значения всех остальных флаговне изменяются.) Например, для установки флага showpos можно воспользоваться следующей инструкцией:лотох_ввода/вывода.setf{ios::showpos);Здесь поток ввода/вывода ~ это тот поток, на который вы хотите повлиять.Обратите внимание на использование оператора расширения области види-246Самоучительмости.
Запомните, флаг showpos — это перечислимая константа внутрикласса ios. Следовательно, чтобы сообщить компилятору об этом, необходимо поставить перед флагом showpos имя класса и оператор расширения области видимости. Если этого не сделать, константа showpos просто не будетраспознана компилятором.Важно понимать, что функция setf() является членом класса ios и влияет насозданные этим классом потоки ввода/вывода.
Поэтому любой вызов функции setfQ делается относительно конкретного потока. Нельзя вызвать функцию setf() саму по себе. Другими словами, в C++ нет понятия глобальногосостояния формата. Каждый поток ввода/вывода поддерживает собственнуюинформацию о состоянии формата.Вместо повторных вызовов функции setfQ в одном вызове можно установить сразу несколько флагов. Для объединения необходимых флагов используйте оператор OR. Например, в следующем вызове функции setf() дляпотока cout устанавливаются флаги showbase и hex;cout,setf(ios::showbase I ios::hex);Поскольку флаги формата определяются внутри класса ios, доступ к нимдолжен осуществляться через класс ios и оператор расширения области видимости. Например, сам по себе флаг showbase задать нельзя, необходимонаписать ios::showbase.Дополнением setfQ является функция unsetfQ.
Эта функция-член класса iosсбрасывает один или несколько флагов формата. Здесь показана ее основнаяформа:void unsetf(fmtflagsфлаги);Флаги, заданные параметром флаги, сбрасываются. (Все остальные флагиостаются без изменений.)Когда-нибудь вам понадобится только узнать текущее состояние флагов ипри этом ничего не менять. Поскольку функции setf() и unsetf() меняют состояние одного или более флагов, в класс ios включена функция-членflags(), которая просто возвращает текущее состояние флагов формата. Здесьпоказан прототип этой функции:fmtflags flags();Функция flags() имеет и вторую форму, которая позволяет установить все,связанные с потоком ввода/вывода, флаги формата.
Флаги задаются в аргументе функции flags(). Здесь показан прототип этой версии функции:fmtflags flags(fmtflags t) ;Глава 8. Введение в систему ввода/вывода C++247При использовании этой версии функции flags() битовый шаблон/копируется в переменную для хранения связанных с потоком флагов формата; приэтом перезаписывается весь предшествующий набор флагов. Функция возвращает предыдущие установки флагов формата.1.
В этом примере показано, как установить несколько флагов формата.^include <iostream>using namespace std;intmainf)I// вывод с использованием установок по умолчаниюcout « 123.23 « " привет " « 100 « '\п' ;cout « 10 «' ' « -10 « '\п';cout « 100.0 « '\п';// теперь меняем форматcout.unsetf(ios::dec); // требуется не для всех компиляторовcout,setf{ios::hex \ ios::scientific);cout « 123.23 « " привет " « 100 « '\n';cout.setf(ios::showpos);cout « 10 «' ' « -10 « '\n';cout.setf(ios::showpoint \ ios::fixed);cout « 100.0;return 0;}После выполнения программы на экран выводится следующее:123.23 привет 10010 -101001.232300е+02 привет 64a fffffff6+100.000000Обратите внимание, что флаг showpos влияет только на вывод десятичныхзначений. Он не влияет на число 10, когда оно выводится в шестнадцатеричной системе счисления.
Кроме того, отметьте, что вызов функции unsetfQприводит к сбросу установленного по умолчанию флага dec. Этот вызов нужен не для всех компиляторов, а только для некоторых, для которых уста-248_СамоучительC++новка флага dec автоматически приводит к сбросу остальных флагов. Поэтому после сброса флага dec необходимо заново установить флаг hex или oct.Как правило, для лучшей переносимости программ лучше установить толькото основание системы счисления, которое вы будете использовать и стеретьостальные.2.
В следующей программе показано действие флага uppercase. В первую очередь устанавливаются флаги uppercase, showbase и hex. Затем выводится число 88 в шестнадцатеричной системе счисления. В этом случае символшестнадцатеричной системы счисления "X" выводится в верхнем регистре.Далее с помощью функции imsetf() сбрасывается флаг uppercase и снова выводится шестнадцатеричное число 88.
Теперь символ "х" оказывается в нижнем регистре.^include <iostream>using namespace std;int main ( )trcout .unset f (ios: :dec) ;cout .setffios: : uppercase | ios: ishowbase | ios::hex);rcout « 88 « \n';cout. unsetf (ios: : uppercase) ;cout « B8 « '\n';return 0;3. В следующей программе для вывода состояния флагов формата потока coutиспользуется функция flagsQ. Обратите особое внимание на функциюshowflags(). Она может вам пригодиться при разработке собственных программ.^include <iostream>using namespace std;void showf lags ( ) ;int main { ){// отображение состояния флагов формата по умолчаниюshowf lags () ;cout. setf (ios: :oct I ios: : showbase I ios: : fixed) ;showf lags () ;return 0;Глава_В. Введение в систему ввода/вывода C++// Эта функция выводит состояние флагов форматаvoid showflags(){ios::fmtflags f;f = cout.flags(); // получение установок флагов форматаif(f & ios::skipws) cout « "skipws установленХп";else cout « "skipws сброшен\n";if(f & ios::left} cout « "left установленХп";else cout « "left сброшен\п";if(f & ios::right) cout « "right установленХп";else cout « "right сброшенХп";if(f & ios::internal) cout « "internal установленХп";else cout « "internal сброшенХп";if(f & ios::dec) cout « "dec установленХп";else cout « "dec сброшенХп";if(f & ios::oct) cout « "oct установленХп";else cout « "oct сброшенХп";if(f & ios::hex) cout « "hex установленХп";else cout « "hex сброшен\п";if(f & ios::showbase) cout « "showbase установленХп";else cout « "showbase сброшенХп";if(f & ios::showpoint) cout « "showpoint установленХп";else cout « "showpoint сброшенХп";if (f & ios::showpos) cout « "showpos установленХп";else cout « "showpos сброшенХп";if(f £ ios::uppercase) cout « "uppercase установленХп";else cout « "uppercase сброшенХп";if(f & ios:scientific) cout « "scientific установленХп";else cout « "scientific сброшенХп";if(f & ios::fixed) cout « "fixed установленХп";else cout « "fixed сброшенХп";if (f & ios::unitbuf) cout « "unitbuf установленХп";else cout « "unitbuf сброшенХп";if(f & ios:iboolalpha) cout « "boolalpha установленХп";else cout « "boolalpha сброшенХп";cout « "Xn";249250Самоучитель C++В функции showflagsQ объявляется локальная переменная f типа fmtflags.
Если в вашем компиляторе тип данных fmtflags не определен, объявите переменную f типа long. Ниже показан результат выполнения программы:skipws установленleft сброшенright сброшенinternal сброшенdec установленoct сброшенhex сброшенshowbase сброшенshowpoint сброшенshowpos сброшенuppercase сброшенscientific сброшенfixed сброшенunitbuf сброшенboolalpha сброшенskipws установленl e f t сброшенright сброшенinternal сброшенdec установленoct установленhex сброшенshowbase установленshowpoint сброшенshowpos сброшенuppercase сброшенscientific сброшенfixed установленunitbuf сброшенboolalpha сброшен4.
В следующей программе проиллюстрирована работа второй версии функцииflags()- Сначала, устанавливая флаги showpos, showbase, oct и right, мы строиммаску флагов. Затем с помощью функции flags() для потока cout маска связывается с переменной флагов. С помощью функции showflagsQ проверяетсяправильность установки флагов. (Это та же функция, которая использоваласьв предыдущей программе.)^include <iostream>using namespace std;void showflagsf);Глава 8. Введение в систему ввода/вывода C++int2_5_1_mainf){// отображение состояния флагов формата по умолчаниюshowf lags () ;// устанавливаются флаги showpos, showbase, cct и right;// остальные сбрасываютсяios:ifmtflags f - ios::showpos | ios::showbase |ios:: oct I ios::right;cout.flags(f); // установка флаговshowflags();return 0;Упражнения!IfiHUfl]1.
Напишите программу, которая бы устанавливала флаги для потока cout так,чтобы целые, если они положительны, выводились со знаком +. Покажите,что ваш набор флагов формата правилен.2. Напишите программу, которая бы устанавливала флаги для потока cout так,чтобы всегда при выводе дробных значений были показаны десятичные точки. Кроме этого, значения с плавающей точкой должны выводиться в научной нотации с символом "Е" в верхнем регистре.3.