首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setw()是怎么回事?

setw()是怎么回事?
EN

Stack Overflow用户
提问于 2011-05-06 08:07:25
回答 2查看 4.8K关注 0票数 17

我最近被ios_base::width和/或setw操纵器必须是reset with every item written to the stream的事实所困扰。

也就是说,您必须这样做:

代码语言:javascript
复制
while(whatever)
{
    mystream << std::setw(2) << myval;
}

而不是这样:

代码语言:javascript
复制
mystream.width(2);
while(whatever)
{
    mystream << myval;
}

好吧,好吧。

但是,有人知道为什么要做出这个设计决定吗?有没有我遗漏的一些理由,或者这只是标准的一个黑暗角落?

其他流格式修饰符(如链接的SO问题中提到的)是“粘性的”,而setw不是。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-06 08:20:52

我的观点是:如果你想让它统一应用,你总是可以像下面这样做。

代码语言:javascript
复制
int width =2;
while(whatever)
{
    mystream << std::setw(width) << myval;
}

但如果像你说的那样粘性的话:

代码语言:javascript
复制
mystream.width(2);
while(whatever)
{
    mystream << myval;
}

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

因此,这两种方法基本上是相同的,我喜欢或不喜欢它们取决于我现在正在做的事情。

票数 4
EN

Stack Overflow用户

发布于 2011-05-06 09:34:21

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

在我看来,以下几点是相关的:

  • some_stream << x应该在大多数情况下都能正常工作,大多数设置宽度的代码都会立即或很快地流式处理该值,所以无关的代码可以假设不会有一些“挂起”的宽度值影响它的宽度不相关,所以只有当output
  • setfill()被显式设置时,setw()才不会对some_stream << x语句产生负面影响
    • 只有在显式设置宽度时,程序员才能/必须考虑填充字符状态是否也合适,这是基于他们对更大的调用context

的了解

对于一组值来说,使用相同的填充操作是很常见的,比如hexoct是持久化的,但是它们的使用通常是在一个代码块中,这些代码要么弹出之前的状态,要么(讨厌但更容易)将它设置回

从这一点引出的回答你的问题...

  • 如果setw()是持久的,则需要在每个流语句之间对其进行重置,以防止不需要的填充...
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5905467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档