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

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

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

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

   
Класс 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);          // Левое выравнивание

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

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий