По умолчанию при использовании экспоненциального представления чисел отображается строчной вариант буквы "е"
. Кроме того, при отображении шестнадцатеричного значения используется также строчная буква "х". После установки флага uppercase отображается прописной вариант этих символов.
Установка флага showpos
вызывает отображение ведущего знака "плюс" перед положительными значениями.
Установка флага showpoint
приводит к отображению десятичной точки и хвостовых нулей для всех чисел с плавающей точкой — нужны они или нет.
После установки флага scientific
числовые значения с плавающей точкой отображаются в экспоненциальном представлении. Если установлен флаг fixed, вещественные значения отображаются в обычном представлении. Если не установлен ни один из этих флагов, компилятор сам выбирает соответствующий метод представления.
При установленном флаге unitbuf
содержимое буфера сбрасывается на диск после каждой операции вывода данных.
Если установлен флаг boolalpha
, значения булева типа можно вводить или выводить, используя ключевые слова true и false.
Поскольку часто приходится обращаться к полям oct
, dec и hex, на них допускается коллективная ссылка ios::basefield. Аналогично поля left, right и internal можно собирательно назвать ios::adjustfield. Наконец, поля scientific и fixed можно назвать ios::floatfield.Чтобы установить флаги форматирования, обратитесь к функции setf().
Для установки любого флага используется функция setf()
, которая является членом класса ios. Вот как выглядит ее формат.
fmtflags setf(fmtflags flags);
Эта функция возвращает значение предыдущих установок флагов форматирования и устанавливает их в соответствии со значением, заданным параметром flags
. Например, чтобы установить флаг showbase, можно использовать эту инструкцию.
stream.setf(ios::showbase);
Здесь элемент stream
означает поток, параметры форматирования которого вы хотите изменить. Обратите внимание на использование префикса ios:: для уточнения принадлежности параметра showbase. Поскольку параметр showbase представляет собой перечислимую константу, определенную в классе ios, то при обращении к ней необходимо указывать имя класса ios. Этот принцип относится ко всем флагам форматирования. В следующей программе функция setf() используется для установки флагов showpos и scientific.
#include
using namespace std;
int main()
{
cout.setf(ios::showpos);
cout.setf(ios::scientific);
cout << 123 << " " << 123.23 << " ";
return 0;
}
Вот как выглядят результаты выполнения этой программы.
+123 +1.232300е+002
С помощью операции ИЛИ
можно установить сразу несколько нужных флагов форматирования в одном вызове функции setf(). Например, предыдущую программу можно сократить, объединив по ИЛИ флаги scientific и showpos, поскольку в этом случае выполняется только одно обращение к функции setf().
cout.setf(ios::scientific | ios::showpos);
Чтобы сбросить флаг, используйте функцию unsetf()
, прототип которой выглядит так.
void unsetf(fmtflags flags);
Для очистки флагов форматирования используется функция unsetf().
В этом случае будут обнулены флаги, заданные параметром flags
. (При этом все другие флаги остаются в прежнем состоянии.)Чтобы получить текущие установки флагов форматирования, используйте функцию flags().
Для того чтобы узнать текущие установки флагов форматирования, воспользуйтесь функцией flags()
, прототип которой имеет следующий вид.
fmtflags flags();
Эта функция возвращает текущее значение флагов форматирования для вызывающего потока.
При использовании следующего формата вызова функции flags()
устанавливаются значения флагов форматирования в соответствии с содержимым параметра flags и возвращаются их предыдущие значения.
fmtflags flags(fmtflags flags);
Чтобы понять, как работают функции flags()
и unsetf(), рассмотрим следующую программу. Она включает функцию showflags(), которая отображает состояние флагов форматирования.
#include
using namespace std;
void showflags(ios::fmtflags f);
int main()
{
ios::fmtflags f;
f = cout.flags();
showflags(f);
cout.setf(ios::showpos);
cout.setf(ios::scientific);
f = cout.flags();