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