Как сохранить форматирование для потоков C ++? - PullRequest
1 голос
/ 07 июля 2010

У меня есть следующий код (упрощенно):

ostringstream oss;

oss << "Text ";

oss << hex << uppercase;
oss.width(8);
oss.fill('0');

oss << var1 << " ";
oss << var2 << " ";

oss << dec << nouppercase;
oss.width(1);

oss << var3 << " another text." << endl;

string result = oss.str();
// work with result...

Где var1, var2 - unsigned int, а var3 - int.Идея состоит в том, чтобы создать строку, в которой var1 и var2 форматируются как шестнадцатеричное число (но без 0x) и var3 как обычное целое число.То, что я обнаружил, что только первое число правильно отформатировано, второе не дополнено нулями:

Text 000AF00C 3B7FF 1 another text.

Через некоторое время я обнаружил, что установка ширины и параметров заливки ОПЯТЬ исправляет это.Есть ли способ, как не указывать эти правила форматирования снова и снова для каждого числа?Количество отформатированных переменных намного больше, чем 2, это был просто упрощенный пример.Оборачивать все это в функцию можно, но мне бы очень хотелось узнать, как сохранить форматирование с помощью ostringstream.

Ответы [ 4 ]

4 голосов
/ 07 июля 2010

Извините, некоторые настройки для форматирования потока называются volatile (не имеет ничего общего с ключевым словом), вы должны устанавливать его каждый раз. См. Здесь для объяснения.

Будет лучше создать свои собственные функции.

3 голосов
/ 07 июля 2010

Есть ли способ избежать повторного указания этих правил форматирования для каждого числа?

Нет, есть манипуляторы, которые являются липкими, и есть такие, которые не . Те, которые не должны повторяться для каждого выхода.

Кстати, вы можете применить синтаксический сахар и включить

oss.width(8);
oss.fill('0');

oss << var1 << " ";

в

oss << std::setw(8) << std::setfill('0') << var1 << " ";
1 голос
/ 07 июля 2010

Как всегда, напишите функцию:

void WriteHex( unsigned int n, ostream & os  ) {
  os << hex << uppercase;
  os.width(8);
  os.fill('0');
  os << n;
}
0 голосов
/ 07 июля 2010

Все ваши настройки формата должны быть сохранены, кроме width, который сохраняется только до следующей операции форматированного вывода. Это связано с тем, что отформатированные выходные функции должны вызывать width(0) в качестве побочного эффекта.

Достаточно кратким решением было бы использование манипулятора setw перед операциями вывода, для которых требуется ненулевая ширина.

Обратите внимание, что вы можете быть удивлены выводом для этого, если вы установили символ заливки и ширина 8 была сохранена из последнего числового вывода.

os << " ";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...