Язык программирования C++ для профессионалов

       

Состояние формата


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

class ios { public: // управляющие форматом флаги: enum { skipws=01, // пропуск обобщенных пробелов для input // поле выравнивания: left=02, // добавление перед значением right=04, // добавление после значения internal=010, // добавление между знаком и значением // основание целого: dec=020, // восьмеричное oct=040, // десятичное hex=0100, // шестнадцатеричное showbase=0200, // показать основание целого showpoint=0400, // выдать нули в конце uppercase=01000, // 'E', 'X' , а не 'e', 'x' showpos=02000, // '+' для положительных чисел // запись числа типа float: scientific=04000, // .dddddd Edd fixed=010000, // dddd.dd // сброс в выходной поток: unitbuf=020000, // после каждой операции stdio=040000 // после каждого символа }; //... };

Смысл флагов будет разъяснен в последующих разделах. Конкретные значения флагов зависят от реализации и даны здесь только для того, чтобы избежать синтаксически неверных конструкций.

Определение интерфейса как набора флагов и операций для их установки или отмены - это оцененный временем, хотя и несколько устаревший прием. Основное его достоинство в том, что пользователь может собрать воедино набор флагов, например, так:

const int my_io_options = ios::left|ios::oct|ios::showpoint|ios::fixed;

Такое множество флагов можно задавать как параметр одной операции

cout.flags(my_io_options);

а также просто передавать между функциями одной программы:

void your_function(int ios_options);

void my_function() { // ... your_function(my_io_options); // ... }

Множество флагов можно установить с помощью функции flags(), например:

void your_function(int ios_options) { int old_options = cout.flags(ios_options); // ... cout.flags(old_options); // reset options }

Функция flags() возвращает старое значение множества флагов. Это позволяет переустановить значения всех флагов, как показано выше, а также задать значение отдельному флагу. Например вызов



Содержание раздела