流填充字符的默认定位



std::setfill的参考页面上,有一个类似于以下程序的示例:

#include <iostream>
#include <iomanip>
int main()
{
std::cout << std::setfill('*') << std::setw(10) << 42 << 'n';
}

声称它应该打印:

********42

这表明填充字符的默认位置就像使用了std::right操纵器一样。

标准是否保证这是行为,还是我需要指定std::right才能确定?

另外,这是否仅适用于std::cout,或者对于任何输出流都是一样的?

setfill

在[std.manip] 中定义为

template<class charT, class traits>
void f(basic_ios<charT, traits>& str, charT c) {
// set fill character
str.fill(c);
}

因此,我们需要看看ostreamfill函数会发生什么,这在[ostream.formatted.reqmts]/3中有详细说明。

如果流 os 的格式化输出函数确定填充,则按如下方式执行此操作。给定一个charT字符序列 seq,其中charT是流的字符类型,如果 seq 的长度小于os.width(),则根据需要向此序列添加足够的os.fill()副本,以填充到os.width()个字符的宽度。如果(os.flags() & ios_­base​::​adjustfield) == ios_­base​::​lefttrue,则填充字符放在字符序列之后;否则,它们将放在字符序列之前。

因此,除非指定left,否则填充字符排在第一位。 默认情况下,left不是cout的设置标志,表 122 中有详细说明: basic_ios::init(( 效果 [tab:basic.ios.cons]

最新更新