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

261
21 июня 2017, 01:15

Не работает такой простейший вывод:

#include <iostream>
#include <iomanip>
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

С чем это может быть связано? Спасибо.

Answer 1

"Не работает" в данном случае именно 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 - то чистка флагов становится вашей ответственностью.

READ ALSO
Странное падение программы [требует правки]

Странное падение программы [требует правки]

Добрый день! Наблюдаю странное падение программы на 20-30 раз запуска, а иногда может и совсем не упастьПодцепив отладчик вчера сидел целый...

186
Ошибка в сортировке массива слов C++

Ошибка в сортировке массива слов C++

Имеется массив char с 14k русских словНеобходимо отсортировать этот массив по алфавиту

234
почтовый клиент pop3 с помощью сокетов

почтовый клиент pop3 с помощью сокетов

Доброго времени суток! Нужно было написать почтовый клиент на сокетах, использующего протокол POP3 для чтения сообщенийНемного погуглив, наклакал...

444