【问题标题】:Default positioning of fill characters for streams流的填充字符的默认定位
【发布时间】:2020-10-23 12:02:43
【问题描述】:

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

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

声称它应该打印:

********42

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

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

另外,这是否仅适用于 std::cout,还是适用于任何输出流?

【问题讨论】:

    标签: c++ language-lawyer iomanip


    【解决方案1】:

    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() &amp; ios_­base​::​adjustfield) == ios_­base​::​lefttrue,则填充字符放在字符序列之后;否则,它们被放置在字符序列之前。

    所以除非指定了left,否则填充字符会排在第一位。默认情况下,left 不是cout 的设置标志,这是Table 122: basic_­ios​::​init() effects   [tab:basic.ios.cons] 中的详细信息

    【讨论】:

      猜你喜欢
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 2013-06-23
      • 2016-07-03
      • 1970-01-01
      相关资源
      最近更新 更多