与setw()有什么关系?

jwd*_*jwd 16 c++ setw c++-standard-library

我最近被这样的事实所困扰:ios_base::width和/或setw操纵器必须在写入流的每个项目时重置.

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

while(whatever)
{
    mystream << std::setw(2) << myval;
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

mystream.width(2);
while(whatever)
{
    mystream << myval;
}
Run Code Online (Sandbox Code Playgroud)

好的.

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

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

Ton*_*roy 5

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

以下几点对我有用:

  • some_stream << x 应该在大多数时间正常工作
  • 设置宽度的大多数代码将立即或非常不久地传输该值,因此不相关的代码可以假设不会有一些"待定"宽度值影响其输出
  • setfill() 除非有待处理setw(),否则不相关,因此不会对列在some_stream << x我们列表中的声明 产生不利影响
    • 只有在明确设置宽度时,程序员才能/必须根据他们对较大调用上下文的了解来考虑填充字符状态是否合适
  • 一组值使用相同的填充字符是很常见的
  • 其它操纵像hexoct持久性,但它们的使用通常是在一个代码块,要么弹出现有状态或(讨厌但更容易)将其设置回十进制

由此引出的一点回答了你的问题 ......

  • 如果setw()是presistent,它需要在每个流语句之间重置,以防止不必要的填充...

  • 在我看来,'hex`是粘性的,就像`setw`是相反的那样......但是有一个彻底的upvote(: (6认同)

Sha*_*nak 4

我的看法是:如果您希望统一应用它,您可以随时执行如下操作。

int width =2;
while(whatever)
{
    mystream << std::setw(width) << myval;
}
Run Code Online (Sandbox Code Playgroud)

但如果它像你提到的那样粘:

mystream.width(2);
while(whatever)
{
    mystream << myval;
}
Run Code Online (Sandbox Code Playgroud)

如果我想要每行都有不同的宽度,我必须继续设置宽度。

所以本质上这两种方法几乎是相同的,我喜欢或不喜欢它们取决于我现在在做什么。