输入流的std :: setfill和std :: setw?

时间:2017-03-01 11:08:53

标签: c++ parsing integer istream setw

考虑以下代码:

int xx;
std::cin >> std::setfill('0') >> std::setw(4) >> xx;

12发送到标准输入时,我希望xx的值为1200,并且在发送12345时我希望它为1234 }。

但是,似乎std::setfillstd::setw无效,我分别获得1212345

这是一个错误还是根据标准?有没有一种获得预期功能的好方法?

另请注意,当我将xx的类型更改为std::string时,std::setw生效,而std::setfill仍然没有生效。

我的编译器是gcc-7.0.1

2 个答案:

答案 0 :(得分:1)

根据C标准,setfill输出流相关。对于setw,当与char*string一起使用时,它适用于输入流。例如,对于输入字符串abcd(以及abcdef的{​​{1}}),程序输出1234之后:

123456

答案 1 :(得分:0)

setwsetfill并未如此普遍适用。

听起来你想模仿在固定宽度列中格式化给定输入的效果,然后重新读取它。该库确实提供了完全相同的工具:

int widen_as_field( int in, int width, char fill ) {
    std::stringstream field;
    field << std::setw( width ) << std::setfill( fill );
    field << std::setiosflags( std::ios::left );
    field << in;
    int ret;
    field >> ret;
    return ret;
}

Demo

此功能不会将12345修剪为1234。这需要通过string进行另一次转换。