考虑以下代码:
int xx;
std::cin >> std::setfill('0') >> std::setw(4) >> xx;
将12
发送到标准输入时,我希望xx
的值为1200
,并且在发送12345
时我希望它为1234
}。
但是,似乎std::setfill
和std::setw
无效,我分别获得12
和12345
。
这是一个错误还是根据标准?有没有一种获得预期功能的好方法?
另请注意,当我将xx
的类型更改为std::string
时,std::setw
生效,而std::setfill
仍然没有生效。
我的编译器是gcc-7.0.1
。
答案 0 :(得分:1)
根据C标准,setfill
与输出流相关。对于setw
,当与char*
或string
一起使用时,它适用于输入流。例如,对于输入字符串abcd
(以及abcdef
的{{1}}),程序输出1234
之后:
123456
答案 1 :(得分:0)
setw
和setfill
并未如此普遍适用。
听起来你想模仿在固定宽度列中格式化给定输入的效果,然后重新读取它。该库确实提供了完全相同的工具:
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;
}
此功能不会将12345
修剪为1234
。这需要通过string
进行另一次转换。