setw()是什么意思?

17

最近我被以下事实困扰:ios_base::width和/或setw操纵器必须在向流写入每个项目时重置

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

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

不要这样做:

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

好的,没问题。

但是有没有人知道为什么要做出这个设计决策?我是否遗漏了某些理由或者这只是标准中的一个黑暗角落?

与其他流格式修饰符(如链接的SO问题中提到的)不同,setw不是“粘性的”。


2个回答

6
决定哪些操作应该仅影响下一个操作似乎是基于逻辑和经验观察,关于什么更容易因素化共同的功能需求,从而更容易让程序员编写并正确执行。
以下几点对我来说很重要:
- 大多数情况下,`some_stream << x` 应该能正常工作 - 大多数设置宽度的代码会立即或很快地流式传输值,因此不相关的代码可以假设不会有一些“待处理”的宽度值影响其输出 - `setfill()` 只有在存在待处理的 `setw()` 时才相关,因此不会对我们列表中排名最高的 `some_stream << x` 语句产生负面影响 - 仅当显式设置宽度时,程序员可以/必须考虑填充字符状态是否合适,这取决于他们对更大的调用上下文的了解 - 一组值使用相同的填充字符非常常见 - 其他像 `hex` 和 `oct` 这样的操作符是持久性的,但它们的使用通常在一个代码块中,该代码块要么弹出先前的状态,要么(更糟糕但更容易)将其设置回十进制
由此引出的答复您的问题的要点是...
- 如果 `setw()` 是持久性的,那么它需要在每个流式传输语句之间重置,以防止不必要的填充...

6
对我来说,“hex”保持粘性与“setw”相反同样是任意的...但你的回答非常详尽,我会点个赞。 - jwd

4
我认为你可以像下面这样做,如果你想要它被统一应用。
int width =2;
while(whatever)
{
    mystream << std::setw(width) << myval;
}

但是,如果像你所提到的那样粘性:

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

如果我想让每一行的宽度都不同,我就必须不停地设置宽度。

因此,这两种方法基本上是相同的,我会根据现在所做的事情来喜欢或不喜欢它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接