与setw()有什么关系?

时间:2011-05-06 00:07:25

标签: c++ c++-standard-library setw

我最近被ios_base::width和/或setw操纵者必须reset with every item written to the stream所困扰。

也就是说,你必须这样做:

while(whatever)
{
    mystream << std::setw(2) << myval;
}

而不是:

mystream.width(2);
while(whatever)
{
    mystream << myval;
}

好的,很好。

但有谁知道为什么做出这个设计决定? 是否有一些我缺失的理由,或者这只是标准的一个黑暗角落?

其他流格式修饰符(如链接的SO问题中所述)是“粘性的”,而setw则不是。“

2 个答案:

答案 0 :(得分:5)

哪些操纵者应该只影响下一个操作的决定似乎是基于对更能影响常见功能需求的逻辑和经验观察,因此程序员更容易编写和正确。

以下几点让我觉得相关:

  • some_stream << x应该在大多数情况下正常工作
  • 设置宽度的大多数代码将立即或非常不久之后传输值,因此不相关的代码可以假设不会有某些“待定”宽度值影响其输出
  • setfill() 不相关,除非有待处理的setw(),因此不会对排在我们列表中的some_stream << x语句产生负面影响
    • 只有在明确设置宽度时,程序员才能/必须根据他们对较大调用上下文的了解来考虑填充字符状态是否合适
  • 一组值使用相同的填充字符非常常见
  • hexoct这样的其他操纵符是持久的,但它们的使用通常在一个代码块中,或者弹出先前的状态,或者(讨厌但更容易)将其设置为十进制

由此回答你的问题 ......

  • 如果setw()是prectent,则需要在每个流语句之间重置,以防止意外填充......

答案 1 :(得分:4)

我看到它的方式是:如果你想要统一应用它,你总是可以做下面的事情。

int width =2;
while(whatever)
{
    mystream << std::setw(width) << myval;
}

但如果你提到它是粘性的:

mystream.width(2);
while(whatever)
{
    mystream << myval;
}

如果我想要每行不同的宽度,我必须保持设置宽度。

所以基本上两种方法几乎都是一样的,我想要或不喜欢它们取决于我现在在做什么。