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不是.
操纵者应该只影响下一个操作的决定似乎是基于对更能影响常见功能需求的逻辑和经验观察,因此程序员更容易编写和正确.
以下几点对我有用:
some_stream << x 应该在大多数时间正常工作setfill() 除非有待处理setw(),否则不相关,因此不会对列在some_stream << x我们列表中的声明
产生不利影响hex和oct持久性,但它们的使用通常是在一个代码块,要么弹出现有状态或(讨厌但更容易)将其设置回十进制由此引出的一点回答了你的问题 ......
setw()是presistent,它需要在每个流语句之间重置,以防止不必要的填充...我的看法是:如果您希望统一应用它,您可以随时执行如下操作。
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)
如果我想要每行都有不同的宽度,我必须继续设置宽度。
所以本质上这两种方法几乎是相同的,我喜欢或不喜欢它们取决于我现在在做什么。