【问题标题】:What's the deal with setw()?与 setw() 有什么关系?
【发布时间】:2011-08-19 19:31:30
【问题描述】:

我最近被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 不是。

【问题讨论】:

标签: c++ c++-standard-library setw


【解决方案1】:

哪些操纵器应该只影响下一个操作的决定似乎是基于逻辑和经验观察,即哪些因素可以更好地考虑常见的功能需求,因此程序员更容易编写和正确。

以下几点让我印象深刻:

  • some_stream &lt;&lt; x 应该大部分时间都可以正常工作
  • 大多数设置宽度的代码会立即或很快地流式传输该值,因此不相关的代码可以假定不会有一些“待定”宽度值影响其输出
  • setfill() 不相关,除非有待处理的 setw(),因此不会对我们列表中的 some_stream &lt;&lt; x 语句产生不利影响
    • 仅当显式设置宽度时,程序员才能/必须考虑填充字符状态是否也合适,基于他们对更大调用上下文的了解
  • 一组值使用相同的填充字符是很常见的
  • hexoct 等其他操纵器是持久的,但它们的使用通常在代码块中,要么弹出先前的状态,要么(讨厌但更容易)将其设置回十进制

由此引出的观点回答了您的问题...

  • 如果setw() 存在,则需要在每个流语句之间重置它以防止不必要的填充...

【讨论】:

  • 在我看来,hex 的粘性与 setw 的相反是任意的......但对彻底性表示赞成(:
【解决方案2】:

我的看法是:如果您希望统一应用,您可以随时执行以下操作。

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

但如果它像你提到的那样粘:

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

如果我想要每行都有不同的宽度,我必须继续设置宽度。

所以基本上这两种方法几乎相同,我喜欢或不喜欢它们取决于我现在在做什么。

【讨论】:

    猜你喜欢
    • 2019-09-14
    • 2011-11-17
    • 2014-07-27
    • 2016-04-29
    • 2021-11-08
    • 2017-06-25
    • 2019-01-09
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多