【问题标题】:How to preserve formatting for C++ streams?如何保留 C++ 流的格式?
【发布时间】:2010-07-07 10:56:22
【问题描述】:

我有以下代码(简化):

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.

过了一会儿,我发现再次设置宽度和填充参数可以解决这个问题。有没有办法避免为每个数字一遍又一遍地指定这些格式规则?格式化变量的数量远高于 2,这只是一个简化的示例。将所有这些包装成一个函数是一种选择,但我真的很想学习如何使用ostringstream 保留格式。

【问题讨论】:

  • 您确定不只是 width 被重置,因为这将是您的实现中的错误吗?
  • 可能只是宽度,没有单独测试宽度/填充。

标签: c++ formatting stream


【解决方案1】:

抱歉,有些流格式设置叫做volatile(跟关键字无关),每次都要设置。 See here for explanation.

最好自己创建函数。

【讨论】:

    【解决方案2】:

    有没有办法避免为每个数字一遍又一遍地指定这些格式规则?

    不,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 << " ";
    

    【讨论】:

    • 我认为区分粘性/非粘性是误导性的。所有的操纵器都有相同的效果:它们在流对象上设置一些东西;只是需要执行许多格式化输出操作的行为来调用(或具有调用效果).width(0) 作为操作的显式部分。 stackoverflow.com/questions/1532640/…
    • @Charles:看来我链接到的问题后来被更改以准确反映这一点。
    • 你的意思是接受的答案?是的,经过长时间的评论交流。
    【解决方案3】:

    和往常一样,写一个函数:

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

    【讨论】:

      【解决方案4】:

      您的所有格式设置都应保留,width 除外,它仅保留到下一次格式化输出操作。这是因为格式化输出函数需要调用 width(0) 作为副作用。

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

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

      os << " ";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 2014-02-12
        相关资源
        最近更新 更多