C++ Программирование в среде С++ Builder 5

         

Форматирующие флаги


Флаги управления форматированием являются битовыми полями, хранящимися в переменной типа fmtflags (псевдоним int). Для их чтения и/или модификации могут применяться следующие функции-элементы класса ics:

  • int flags (), int flags (int). Без параметра возвращает текущее состояние флагов. При указанном параметре устанавливает новые значения флагов и возвращает их прежнее состояние.
  • int setf(int), long setf(int, int). Первая форма устанавливает флаги, биты которых установлены в параметре. Вторая форма модифицирует флаги, биты которых установлены во втором параметре. Значения этих флагов задаются первым параметром. Возвращает прежнее состояние всех флагов.
  • void unsetf(int). Сбрасывает флаги, биты которых установлены в параметре.
  • Помимо функций, для управления флагами можно пользоваться манипуляторами setiosflags (аналог setf() с одним параметром) и reset-iosflags (аналог unsetf ()).

    В таблице 9.3 описаны форматирующие флаги потоков.

    Таблица 9.3. Форматирующие флаги класса ios

    Флаг Описание

    internal Если установлен, при выводе чисел знак выводится на левом краю поля вывода, а само число выравнивается по правому краю поля. Промежуток заполняется текущим символом заполнения.
    dec

    Устанавливает десятичное представление чисел. Принимается по умолчанию.
    oct Устанавливает восьмеричное представление чисел.
    hex Устанавливает шестнадцатеричное представление чисел.
    showbase Если установлен, то при восьмеричном и шестнадцатеричном представлении чисел выводит индикатор основания (0 для восьмеричных и Ох для шестнадцатеричных чисел).
    showpoint Если установлен, для вещественных чисел всегда выводится десятичная точка.
    uppercase Если установлен, шестнадцатеричные цифры от А до F, а также символ экспоненты Е выводятся в верхнем регистре.
    boolalpfa Если установлен, булевы значения выводятся как слова “true/false”. В противном случае они представляются соответственно единицей и нулем.
    showpos Выводит + для положительных чисел.
    scientific Если установлен, вещественные числа выводятся в научной (экспоненциальной) нотации.
    fixed Если установлен, вещественные числа выводятся в десятичном формате (с фиксированной точкой).
    unitbuf Если установлен, поток сбрасывается после каждой операции передачи.
    <
    Несколько замечаний относительно перечисленных в таблице флагов.

  • Флаги left, right и internal являются взаимоисключающими. В данный момент времени может быть установлен только один из них.


  • Взаимоисключающими являются также флаги dec, oct и hex.


  • При модификации базы представления в качестве второго параметра setf() можно использовать константу ios: :basefield.


  • При модификации выравнивания в поле можно аналогичным образом использовать константу ios: :adjustfield.


  • При модификации формы представления (нотации) чисел с плавающей точкой можно использовать константу ios : : floatfield. Ниже мы приводим листинг программы, демонстрирующей применение различных флагов форматирования.




  • Имена перечисленных выше флагов и других констант принадлежат к области действия класса ios. Вне этого класса нужно либо воспользоваться разрешением области действия (ios : : scientific), либо обращаться к ним, как к элементам существующего объекта (cout. scientific). Мы поедпочитаем первый способ.



    Листинг 9.3. форматирующие флаги потоков



    ////////////////////////////////////////////////////

    // Flags.срр: Форматирующие флаги потоков.

    //

    #include <iostream.h>

    #include <iomanip.h> #pragma hdrstop

    #include <condefs.h>

    #pragma argsused

    int main(int argc, char* argv[])

    {

    //

    // Демонстрация флага skipws. Если его сбросить, то при

    // наличии начальных пробелов при вводе возникает ошибка.

    //

    long 1;

    cout<< "Enter an integer: ";

    cin.unsetf(ios::skipws);

    cin >> 1;

    if (cin) // При ошибке потока

    cin == NULL. cout<< "You entered "<< 1<< endl;

    else {

    cout << "Incorrect input."<< endl;

    cin.clear (); // Обнуление битов ошибки.

    } cout<<endl;

    //

    // Демонстрация флагов основания и знака.

    // Задается основание 16, вывод индикатора и знака +.

    //

    1 = 8191;

    cout.setf(ios::hex, ios::basefield);

    cout.setf(ios::showbase | ios::showpos);

    cout << "hex: " <<1 << oct // Изменим основание



    << " oct: "<< 1 << dec // манипулятором.

    << " dec: " << 1 << endl;

    cout << endl;

    //

    // Демонстрация флагов формата вещественных чисел.

    //

    double dl = 1.0е9, d2 = 34567.0;

    cout <<"Default: " << dl << " "<<d2 << end1;

    // Вывод десятичной точки. cout.setf(ios::showpoint);

    cout << "Decimal: " << dl<< " " << d2 << endl;

    // Нотация с фиксированной точкой.

    // Заодно сбросим вывод знака +.

    cout.setf(ios::fixed, ios::floatfield | ios::showpos);

    cout << "Fixed: " << dl << " " << d2 << endl;

    cout<< endl;

    //

    // Вывод булевых значений как "true/false".

    //

    bool b = true;

    cout.setf(ios::boolalpha) ;

    cout << "Boolean values: " << b << '' << !b endl;

    return 0;

    }



    Рис. 9.2 Демонстрация флагов форматиоования потока


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