我最近被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
则不是。“
答案 0 :(得分:5)
哪些操纵者应该只影响下一个操作的决定似乎是基于对更能影响常见功能需求的逻辑和经验观察,因此程序员更容易编写和正确。
以下几点让我觉得相关:
some_stream << x
应该在大多数情况下正常工作setfill()
不相关,除非有待处理的setw()
,因此不会对排在我们列表中的some_stream << x
语句产生负面影响
hex
和oct
这样的其他操纵符是持久的,但它们的使用通常在一个代码块中,或者弹出先前的状态,或者(讨厌但更容易)将其设置为十进制由此回答你的问题 ......
setw()
是prectent,则需要在每个流语句之间重置,以防止意外填充...... 答案 1 :(得分:4)
我看到它的方式是:如果你想要统一应用它,你总是可以做下面的事情。
int width =2;
while(whatever)
{
mystream << std::setw(width) << myval;
}
但如果你提到它是粘性的:
mystream.width(2);
while(whatever)
{
mystream << myval;
}
如果我想要每行不同的宽度,我必须保持设置宽度。
所以基本上两种方法几乎都是一样的,我想要或不喜欢它们取决于我现在在做什么。