Шаг 489.
Библиотека STL. Ввод-вывод с использованием потоковых классов. Стандартные функции ввода-вывода. Форматирование. Система счисления

    На этом шаге мы рассмотрим способы задания системы счисления.

    Следующая группа из трех флагов управляет основанием системы счисления, используемой при вводе-выводе целых чисел (таблица 1). Флаги определяются в классе ios_base вместе с соответствующей маской.

Таблица 2. Флаги системы счисления
Маска Флаг Описание
basefield oct Чтение/запись в восьмеричной системе
dec Чтение/запись в десятичной системе (используется по умолчанию)
hex Чтение/запись в шестнадцатеричной системе
нет Запись в шестнадцатеричной системе, чтение в зависимости от начальных символов целого числа

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

    Флаги системы счисления также распространяются на ввод. Данные читаются в системе, определяемой установкой одного из флагов. Если флаги не установлены, то при чтении основание системы счисления определяется по префиксу: число, начинающееся с префикса или 0X, интерпретируется как шестнадцатеричное. Префикс 0 является признаком восьмеричной записи. Во всех остальных случаях число считается десятичным.

    Существуют два основных способа переключения флагов системы счисления.

    В таблице 2 перечислены манипуляторы, упрощающие работу с флагами этой группы.

Таблица 2. Манипуляторы, определяющие основание системы счисления
Манипулятор Описание
oct Запись и чтение в восьмеричной системе
dec Запись и чтение в десятичной системе
hex Запись и чтение в шестнадцатеричной системе

    Например, следующий фрагмент выводит х и у в шестнадцатеричной системе, a z - в десятичной системе:

int х, у, z;
std::cout << std::ios::hex << x << std::endl;
std::cout << у << ' ' << std::ios::dec << z << std::endl;

    Дополнительный флаг showbase выводит числа по стандартным правилам обозначения системы счисления числовых литералов в C/C++ (таблица 3).

Таблица 3. Флаг, обозначающий основание системы счисления
Флаг Описание
showbase Если флаг установлен, при выводе указывается система счисления числовых литералов

    При установке флага ios::showbase восьмеричные числа выводятся с префиксом 0, а шестнадцатеричные числа - с префиксом 0x (или при установленном флаге ios::uppercase - 0X). Например, рассмотрим такой фрагмент:

std::cout << 127 << ' ' << 255 << std::endl;
std::cout << std::hex << 127 << ' ' << 255 << std::endl;
std::cout.setf(std::ios::showbase);
std::cout << 127 <<  ' ' << 255 << std::endl; 
std::cout.setf(std::ios:uppercase); 
std::cout << 127 << ' ' << 255 << std::endl;

    Этот фрагмент выводит следующий результат:

127 255 
7f ff 
0x7f 0xff 
0X7F 0XFF

    Для управления флагом ios::showbase также можно использовать манипуляторы, представленные в таблице 4.

Таблица 4. Манипуляторы для идентификации системы счисления
Манипулятор Описание
showbase Вывод идентификатора системы счисления (установка флага ios::showbase)
noshowbase Запрет на вывод идентификатора системы счисления (сброс флага ios::showbase)

    На следующем шаге мы рассмотрим формат вещественных чисел.




Предыдущий шаг Содержание Следующий шаг