我怀疑您的理解std::setw
根本不正确。我认为您需要更多类似以下组合的东西:
您的代码中发生了什么:
- 用于
std::setw(5)
建立五个字符的字段宽度。
- 发送
"first"
到流,长度为五个字符,因此已建立的字段宽度完全消耗。不会进行额外的填充。
- 发送
"second"
到长度为六个字符的流,因此再次消耗了整个字段宽度(实际上是违反了)。同样,没有填充发生
如果您打算拥有这样的东西(上面的列号显示位置):
col: 0123456789012345678901234567890123456789
first second third fourth
注意每个单词是如何从 10 的偶数倍数边界开始的。一种方法是使用:
- 一个输出位置
std::left
(所以填充,如果有的话在右边达到所需的宽度)。这是字符串的默认设置,但确定它永远不会有坏处。
- 的填充字符
std::setfill(' ')
。再次,默认。
- 一个字段宽度
std::setw(10)
为什么这么大?见下文
例子
#include <iostream>
#include <iomanip>
int main ()
{
std::cout << std::left << std::setfill(' ')
<< std::setw(10) << "first"
<< std::setw(10) << "second"
<< std::setw(10) << "third"
<< std::setw(10) << "fourth" << '\n';
return 0;
}
输出(添加列号)
0123456789012345678901234567890123456789
first second third fourth
那么如果我们将输出位置更改为 会发生什么std::right
?好吧,使用相同的程序,仅将第一行更改为:
std::cout << std::right << std::setfill(' ')
我们得到
0123456789012345678901234567890123456789
first second third fourth
最后,查看填充字符应用位置的一种建设性方法是简单地将填充字符更改为可见的东西(即除了空格之外的东西)。最后两个示例输出,将填充字符更改为std::setfill('*')
产生以下输出:
第一的
first*****second****third*****fourth****
第二
*****first****second*****third****fourth
请注意,在这两种情况下,由于没有单个输出项违反该std::setw
值,因此每个输出项的总输出行大小相同。所改变的只是应用填充的位置和符合std::setw
规范的输出。