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

   


Назад  |  Вперёд

В классе 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). Приемы работы с состоянием потока лучше изучить на примере реализации класса, чем изучая интерфейс класса.


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.