Шаг 485.
Библиотека STL. Ввод-вывод с использованием потоковых классов. Стандартные функции ввода-вывода. Форматирование. Форматные флаги

    На этом шаге мы рассмотрим форматные флаги.

    Форматы ввода-вывода в наибольшей степени зависят от двух факторов. Первый и наиболее очевидный - форматные флаги, которые, в частности, определяют точность вывода чисел, символ-заполнитель и основание системы счисления. Другой фактор - настройка форматов под национальные стандарты.

    Начиная с этого шага, мы останоимся на форматных флагах, а аспекты форматирования, относящиеся к интернационализации программ, будут описаны позднее.

Форматные флаги

    Класс ios_base содержит ряд переменных, предназначенных для определения форматов ввода-вывода. В частности, эти переменные определяют минимальную ширину поля, точность вывода вещественных чисел и заполнитель. Переменная типа ios::fmtflags содержит флаги конфигурации, которые определяют, нужно ли выводить знак перед положительными числами, должны ли логические значения выводиться в числовом или в символьном виде, и т. д.

    Некоторые форматные флаги составляют группы. Например, признаки восьмеричного, десятичного и шестнадцатеричного форматов целых чисел входят в группу. Определены специальные маски, упрощающие работу с группами.

    В таблице 1 перечислены функции, предназначенные для работы со всеми определениями форматов для потоков данных.

Таблица 1. Функции для работы с форматами
Функция Описание
setf(флаги) Устанавливает флаги, переданные в аргументе, в качестве дополнительных форматных флагов и возвращает предыдущее состояние всех флагов
setf(флаги, маска) Устанавливает флаги, переданные в первом аргументе, в качестве новых форматных флагов для группы, которая идентифицируется маской, переданной во втором аргументе, и возвращает предыдущее состояние всех флагов
unsetf(флаги) Сбрасывает флаги, переданные в аргументе
flags() Возвращает весь набор форматных флагов
flags(флаги) Устанавливает флаги, переданные в аргументе, в качестве новых форматных флагов и возвращает предыдущее состояние всех флагов
сору(поток) Копирует все определения форматов из потока, переданного в аргументе

    Функции setf() и unsetf() соответственно устанавливают и сбрасывают один или несколько флагов. Чтобы операция выполнялась сразу с несколькими флагами, следует объединить их оператором | (поразрядная дизъюнкция). Во втором аргументе функции setf() может передаваться маска, по которой сбрасываются все флаги группы перед установкой флагов, передаваемых в первом аргументе (и также ограниченных группой). Такая возможность не поддерживается версией setf(), вызываемой с одним аргументом. Пример:

// Установка флагов showpos и uppercase
std::cout.setf (std::ios::showpos | std::ios::uppercase);
// Установка только флага hex в группе basefield 
std::cout.setf (std::ios::hex, std::ios::basefield);
// Сброс флага uppercase
std::cout.unsetf (std::ios::uppercase);

    Функция flags() позволяет работать со всеми форматными флагами сразу. Вызов flags() без аргумента возвращает текущие форматные флаги. При вызове flags() с передачей аргумента этот аргумент интерпретируется как новое состояние всех форматных флагов, а функция возвращает старое состояние. Следовательно, при вызове flags() с аргументом все флаги сбрасываются, а устанавливаются только переданные флаги. Например, при помощи функции flags() можно сохранить текущее состояние флагов для последующего восстановления. В следующем фрагменте показано, как это делается:

using std::ios, std::cout:
// Сохранение текущих форматных флагов 
ios::fmtflags oldFlags = cout.flags();
// Изменение состояния флагов
cout.setf(ios::showpos | ios::showbase | ios:uppercase);
cout.setf(ios::internalб ios::adjustfield);
cout << std::hex << x << std::endl;
// Восстановление сохраненных форматных флагов 
cout.flags(oldFlags);

    Функция copyfmt() позволяет скопировать состояние форматных флагов из одного потока данных в другой. Установка и сброс форматных флагов могут производиться при помощи манипуляторов, представленных в таблице 2.

Таблица 2. Манипуляторы для работы с форматными флагами
Манипулятор Описание
setiosflags(флаги) Устанавливает форматные флаги, переданные в аргументе, путем вызова функции setf(флаги) для потока данных
resetiosflags(маска) Сбрасывает все флаги группы, определяемой значением маски, путем вызова функции setf(0, маска) для потока данных

    Манипуляторы setiosflags() и resetiosflags() дают возможность соответственно установить или сбросить один или несколько флагов в командах записи или чтения с использованием оператора << или >>. Чтобы использовать эти манипуляторы в программе, в нее необходимо включить заголовочный файл <iomanip>. Пример:

#include <iostream> 
#include <iomanip>
.   .   .   .
std::cout << resetiosflags(std::ios::adjustfield)  // Сброс выравнивания
          << setiosflags(std::ios::left);          // Левое выравнивание

    Некоторые операции с флагами выполняются при помощи специализированных манипуляторов. Благодаря своему удобству и наглядности эти манипуляторы используются достаточно часто. Они будут рассмотрены позднее.

    На следующем шаге мы рассмотрим форматированный ввод-вывод логических данных.




Предыдущий шаг Содержание Следующий шаг