Язык программирования 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() возвращает старое значение множества флагов. Это позволяет переустановить значения всех флагов, как показано выше, а также задать значение отдельному флагу. Например вызов

myostream.flags(myostream.flags()|ios::showpos);

заставляет класс myostream выдавать положительные числа со знаком + и, в то же время, не меняет значения других флагов. Получается старое значение множества флагов, к которому добавляется с помощью операции | флаг showpos. Функция setf() делает то же самое, поэтому эквивалентная запись имеет вид

myostream.setf(ios::showpos);

После установки флаг сохраняет значение до явной отмены.

Все-таки управление вводом-выводом с помощью установки и отмены флагов - грубое и ведущее к ошибкам решение. Если только вы тщательно не изучите свое справочное руководство и не будете применять флаги только в простых случаях, как это делается в последующих разделах, то лучше использовать манипуляторы (описанные в 10.4.2.1). Приемы работы с состоянием потока лучше изучить на примере реализации класса, чем изучая интерфейс класса.


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