На этом шаге мы рассмотрим форматные флаги.
Форматы ввода-вывода в наибольшей степени зависят от двух факторов. Первый и наиболее очевидный - форматные флаги, которые, в частности, определяют точность вывода чисел, символ-заполнитель и основание системы счисления. Другой фактор - настройка форматов под национальные стандарты.
Начиная с этого шага, мы останоимся на форматных флагах, а аспекты форматирования, относящиеся к интернационализации программ, будут описаны позднее.
Класс ios_base содержит ряд переменных, предназначенных для определения форматов ввода-вывода. В частности, эти переменные определяют минимальную ширину поля, точность вывода вещественных чисел и заполнитель. Переменная типа ios::fmtflags содержит флаги конфигурации, которые определяют, нужно ли выводить знак перед положительными числами, должны ли логические значения выводиться в числовом или в символьном виде, и т. д.
Некоторые форматные флаги составляют группы. Например, признаки восьмеричного, десятичного и шестнадцатеричного форматов целых чисел входят в группу. Определены специальные маски, упрощающие работу с группами.
В таблице 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.
Манипулятор | Описание |
---|---|
setiosflags(флаги) | Устанавливает форматные флаги, переданные в аргументе, путем вызова функции setf(флаги) для потока данных |
resetiosflags(маска) | Сбрасывает все флаги группы, определяемой значением маски, путем вызова функции setf(0, маска) для потока данных |
Манипуляторы setiosflags() и resetiosflags() дают возможность соответственно установить или сбросить один или несколько флагов в командах записи или чтения с использованием оператора << или >>. Чтобы использовать эти манипуляторы в программе, в нее необходимо включить заголовочный файл <iomanip>. Пример:
#include <iostream> #include <iomanip> . . . . std::cout << resetiosflags(std::ios::adjustfield) // Сброс выравнивания << setiosflags(std::ios::left); // Левое выравнивание
Некоторые операции с флагами выполняются при помощи специализированных манипуляторов. Благодаря своему удобству и наглядности эти манипуляторы используются достаточно часто. Они будут рассмотрены позднее.
На следующем шаге мы рассмотрим форматированный ввод-вывод логических данных.