如何保留C ++流的格式?

时间:2010-07-07 10:56:22

标签: c++ formatting stream

我有以下代码(简化):

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...

var1var2unsigned intvar3int。我们的想法是创建一个字符串,其中var1var2形成十六进制数(但不包含0x)和var3作为常规整数。我发现只有第一个数字被正确格式化,第二个数字没有用零填充:

Text 000AF00C 3B7FF 1 another text.

过了一会儿,我发现设置宽度和填充参数AGAIN修复了这个问题。有没有办法如何避免为每个数字反复指定这些格式规则?格式化变量的数量远远高于2,这只是一个简化的例子。将所有这些包装成一个函数是一个选项,但我真的想学习如何使用ostringstream保留格式。

4 个答案:

答案 0 :(得分:4)

抱歉,流格式化的一些设置称为volatile(与关键字无关),您必须每次都设置它。 See here for explanation.

最好创建自己的功能。

答案 1 :(得分:3)

  

有没有办法避免为每个数字反复指定这些格式规则?

不,there are manipulators which are sticky and there are those which are not。那些不必为每个输出重复的那些。

顺便说一句,你可以申请一些语法糖并转

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

oss << var1 << " ";

进入

oss << std::setw(8) << std::setfill('0') << var1 << " ";

答案 2 :(得分:1)

一如既往,写一个函数:

void WriteHex( unsigned int n, ostream & os  ) {
  os << hex << uppercase;
  os.width(8);
  os.fill('0');
  os << n;
}

答案 3 :(得分:0)

除了width之外,应保留所有格式设置,width(0)仅在下一次格式化输出操作之前保留。这是因为需要格式化的输出函数来调用setw作为副作用。

一个相当简洁的解决方案是在需要非零宽度的输出操作之前使用os << " "; 操纵器。

请注意,如果您设置了填充字符并且从最后一个数字输出中保留了8的宽度,您可能会对此输出感到惊讶。

{{1}}