logo
шпоры по ООП

38.Способы управления форматом выходных данных.

Библиотека потоков С++ предусматривает три способа управления форматом выходных данных: вызов форматирующих функций, использование флагов и применение манипуляторов. Далее будут рассмотрены эти способы.

Большинство средств управления вводом-выводом сосредоточены в классе ios, члены которого (переменные и функции) будут в основном и рассматриваться. Этот класс является базовым для ostream и istream.

По сути, здесь находится управление связью между istream или ostream и буфером, используемым для операций ввода-вывода. Именно класс ios контролирует: как символы попадают в буфер и как они выбираются оттуда.

К функциям форматирования относятся следующие функции класса ios:

width() - определения ширины поля;

fill() - определения символа-заполнителя;

precision() - определения точности чисел с плавающей точкой.

Определение ширины поля:

int width() - возвращает текущее значение внутренней переменной ширины поля потока;

int width(int) - устанавливает значение внутренней переменной ширины поля и возвращает предыдущее значение.

Определение символа-заполнителя:

char fill() - возвращает текущий символ-заполнителя;

char fill(char) - устанавливает символ-заполнитель и возвращает его предыдущее значение. Установленный символ используется вместо пробела для дополнения полей при выводе до указанной ширины

Определение точности чисел с плавающей точкой:

int precision() - возвращает текущее значение внутренней переменной точности;

int precision(int) - устанавливает значение внутренней переменной точности и возвращает предыдущее значение.

В классе ios содержатся флаги, определяющие порядок форматирования ввода и вывода. Эти флаги являются однобитовыми полями, хранящимися в переменной типа long. Установка и получение значений флагов выполняется специальными функциями класса ios. Значения установленных флагов форматирования:

skipws - пропуск начальных пробелов при вводе (или эквивалентных им символов) (по умолчанию);

left - выравнивание выводимых данных влево;

right - выравнивание выводимых данных вправо (по умолчанию);

internal - знак числа выводится слева, а число выравнивается вправо;

showpos - вывод знака '+' для положительных чисел;

dec - вывод числа по основанию 10 (по умолчанию);

oct - вывод числа по основанию 8;

hex - вывод числа по основанию 16;

showbase - при выводе не десятичных чисел добавляется индикатор основания:

"0" - для восьмиричных, "0x" - для 16-тиричных;

showpoint - при выводе вещественных чисел отображать десятичную точку;

uppercase - вывод шестнадцатиричных цифр 'A' - 'F' и обозначения экспоненты - 'E' в верхнем регистре;

scientific - вывод вещественных чисел выполнять в формате x.xxxxEy;

fixed - вывод вещественных чисел выполнять в формате xxx.xxxxxx.

Имена флагов заданы в виде перечисления в классе ios и доступны для испрользования.

Флаги left/right/internal, флаги dec/oct/hex и scientific/fixed взаимно исключают друг друга и не могут быть одновременно установлены.

Функции управления флагами:

long flags() - возвращает текущие флаги потока;

long flags(long) - присваивает флагам значение и возвращает прежнее значение флагов потока;

long setf(long) - устанавливает в единицу флаги, биты которых установлены в параметре, возвращает прежнее значение флагов;

long setf(long,long) - присваивает флагам, биты которых перечислены вторым параметром, значение бит первого параметра;

long unsetf(long) - сбрасывает флаги, биты которых установлены в параметре, возвращает прежнее значение флагов.

Примеры:

cout.flags(cout.flags()|ios::showpos); // вывод знака '+'

cout.setf(ios::showpos); // вывод знака '+'

cout.setf(ios::showpos); // вывод знака '+'

cout.unsetf(ios::showpos); // отмена вывода знака '+'

cout.setf(ios::left,ios::left|ios::rigth|ios::internal); // выравнивание влево.

Так как установка одного из взаимоисключающих флагов должна вестись одновременно со сбросом других связанных с ним флагов, в классе ios описан набор констант для использования в качестве второго параметра функции setf():

static const long basefield; // dec | oct | hex

static const long adjustfield; // left | right | internal

static const long floatfield; // scientific | fixed

Следует отметить, что управление вводом-выводом с помощью установки и отмены флагов является решением, которое может привести к ошибкам. Предпочтительнее, там, где это возможно, использовать манипуляторы, которые будут рассмотрены далее.