2011-05-06 52 views
16

我最近的事实,ios_base::width和/或setw操纵者必须reset with every item written to the stream咬伤。比这更确切地说与setw()有什么关系?

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

也就是说,你必须这样做

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

好,很好。

但没有人知道为什么要这样设计作出决定? 是否有一些我错过的理由,或者这只是标准的黑暗角落?

其他流格式化改性剂(如在联SO问题中提到)是“粘性”,而setw不是。

+0

参见[哪个了iomanip操纵器 '粘性'?](HTTP:// stackoverflow.com/q/1532640/2778484)。 – chappjc 2014-08-07 18:38:25

回答

4

我看到它的方式是:如果你希望它是均匀地涂你总是可以这样做以下。

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

但如果是粘你提到:

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

,如果我想要一个不同宽度的每一行我必须保持设定的宽度。

所以基本上这两种方法都差不多,我也喜欢或不喜欢他们根据什么我现在做的事情。

5

其中的操纵应该只影响下一个操作的决定似乎是基于什么趋于因素共同功能需要更好的,因此是程序员编写并得到正确的逻辑更加容易和经验观察。

以下几点罢工我有关:

  • some_stream << x应该只是工作权大部分时间
  • 大部分代码,设置宽度将立即或非常不久之后流的价值,所以不相关的代码可以假设也不会有影响其输出
  • setfill()一些“悬而未决”的宽度值是不相关的除非有一个未决setw(),所以不会对some_stream << x声明产生不利影响摘心我们的名单
    • 只有当宽度被明确设置,程序员可以/必须考虑填充字符状态是否合适也基于他们对较大的调用上下文
  • 的知识,这是很常见的一个值的集合使用相同的填充字符
  • 其它操纵器等hexoct是持久的,但它们的使用通常是在一个代码块,要么弹出现有状态或(讨厌但更容易)将其设置回十进制

由此导致的问题回答您的问题 ...

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

在我看来,'hex'被粘在一起就像'setw'正好相反......但是对于彻底性而言却赞不绝口: – jwd 2011-05-09 18:01:21

相关问题