Страницы

Поиск по вопросам

вторник, 30 октября 2018 г.

Не работают манипуляторы вывода потока ostream

Не работает такой простейший вывод:
#include #include int main() { int x(84568); std::cout << std::setiosflags( std::ios_base::hex | std::ios_base::showbase | std::ios_base::uppercase) << x << std::endl; std::cout << x << std::endl;
return 0; }
Вывод таков:
84568
84568
С чем это может быть связано? Спасибо.


Ответ

"Не работает" в данном случае именно std::ios_base::hex.
Функция setiosflags выставляет флаги по логике побитового ИЛИ. std::ios_base::hex - это не просто один флаг, который можно просто взять и выставить. Форматам dec, hex и oct по понятным причинам соответствует целое битовое поле, состоящее из нескольких битов. Выставлять значение этого поля по логике ИЛИ (как это делает setiosflags) будет неправильно. Единичные биты для hex, разумеется, выставятся, но уже уже присутствовавшие в этом поле единичные биты, скажем, для dec при этом не сбросятся. В результате произойдет "перемешивание" битов dec и битов hex с непредсказуемым результатом. В вашем случае формат просто остался dec
Для того, чтобы перейти в формат hex через setiosflags надо сначала обнулить быты, ответственные за выбор системы счисления, а уж затем можно будет применять побитовое ИЛИ для выставления нового значения флагов через setiosflags. Например
std::cout << std::resetiosflags(std::ios_base::basefield) << std::setiosflags(std::ios_base::hex) << x << std::endl;
Когда вы пользуетесь манипулятором std::hex он все делает за вас сам - чистит старые флаги и выставляет новые. А если вы хотите пользоваться setiosflags - то чистка флагов становится вашей ответственностью.

Комментариев нет:

Отправить комментарий