2017-03-01 117 views
0

考虑以下代码:输入流的std :: setfill和std :: setw?

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

当发送12标准输入我期待的xx值是1200和发送12345时,我希望它是1234

但是,看起来std::setfillstd::setw没有效果,我分别得到1212345

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

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

我的编译器是gcc-7.0.1

+3

也许我错过了。因为什么时候在* input *流操作上支持'std :: setfill'?我知道'std :: setw'是,但现在'std :: setfill'也是? – WhozCraig

+0

不行,这是恶意代码。 –

+0

我不认为输入流支持'std :: setfill'。 http://en.cppreference.com/w/cpp/io/manip/setfill – Shravan40

回答

1

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

不过,该功能不会削减123451234。这将需要通过string进行另一次转换。

1

根据C标准,setfill属于输出流。至于setw,它与char*string一起使用时适用于输入流。例如,下面的程序(1234561234)输出abcd用于输入字符串abcdef

string a; 
cin >> setw(4) >> a; 
cout << a; 
相关问题