我最近被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不是。
发布于 2011-05-06 08:20:52
我的观点是:如果你想让它统一应用,你总是可以像下面这样做。
int width =2;
while(whatever)
{
mystream << std::setw(width) << myval;
}但如果像你说的那样粘性的话:
mystream.width(2);
while(whatever)
{
mystream << myval;
}如果我想要一个不同的宽度,每一行我必须保持设置宽度。
因此,这两种方法基本上是相同的,我喜欢或不喜欢它们取决于我现在正在做的事情。
发布于 2011-05-06 09:34:21
哪些操纵器应该只影响下一个操作的决定似乎是基于逻辑和经验上的观察,即什么倾向于更好地考虑共同的功能需求,因此程序员更容易编写和正确。
在我看来,以下几点是相关的:
some_stream << x应该在大多数情况下都能正常工作,大多数设置宽度的代码都会立即或很快地流式处理该值,所以无关的代码可以假设不会有一些“挂起”的宽度值影响它的宽度不相关,所以只有当outputsetfill()被显式设置时,setw()才不会对some_stream << x语句产生负面影响的了解
对于一组值来说,使用相同的填充操作是很常见的,比如hex和oct是持久化的,但是它们的使用通常是在一个代码块中,这些代码要么弹出之前的状态,要么(讨厌但更容易)将它设置回
从这一点引出的回答你的问题...
setw()是持久的,则需要在每个流语句之间对其进行重置,以防止不需要的填充...https://stackoverflow.com/questions/5905467
复制相似问题