关于cin.clear()的问题

时间:2011-08-20 09:30:52

标签: c++ inputstream

我正在阅读Accelerated C ++一书。 (我的问题出在第57页,如果你们有这本书的话)

问题如下: 我们有一个读取学生成绩的功能:

...
while (in >> x) {    // in and x are defined as an istream& and as a double
    hw.push_back(x);    // hw is vector defined as vector<double>&
}
in.clear();
...

现在,在书中以及cplusplus.com上都提到了clear函数重置所有错误状态,并且输入现在再次准备好读取某些输入。 问题是,如果我把:

int a = 0;
cin >> a;
cout << a << endl;

在函数之后跳转cin并给我一个0.我是否理解cin.clear()的功能是完全错误的,或者我该如何才能使cin再次激活。

由于我在读这本书之前有一段时间遇到同样的问题,我知道我当时用以下一行解决了这个问题:

    cin.ignore( numeric_limits<streamsize>::max(), '\n');

当然,我必须点击一个额外的输入键,但它会吃掉之前发生的所有东西,这使得cin无法正常工作。

事情是,.clear和.ignore都不能正常工作但是将它们一起使用我能够为变量a输入一些东西;

编辑:好的,这是整个代码。这是我自己写的,不是书中的。

istream& in = cin; 
int var = 0;
vector<int> vec;
while ( in >> var ) { 
    vec.push_back(var); 
}
for (int f = 0; f < vec.size(); ++f) {
    cout << vec[f] << endl;
}
cin.clear();
cout << "cleared" << endl;
    int a = 0;
    cin >> a;
    cout << a << endl;

2 个答案:

答案 0 :(得分:3)

clear的调用会清除读取失败所设置的错误状态。它对输入流中可能存在的字符没有任何作用。

如果错误状态是未能读取double的结果,则下一个字符可能也会以整数形式失败。

如果您尝试

char ch;
cin >> ch;

我相信会更好。

否则你将需要ignore一些字符​​来摆脱不可读的输入。

答案 1 :(得分:2)

代码示例中的while循环读取整数值,直到输入结束或读取时发生错误,例如给出一个不能像'q'这样的整数数字出现的字符。

当发生错误时,您可能有机会通过调用clear()然后从cin的输入缓冲区中删除有问题的字符来从该错误中恢复:

char dummy;
cin >> dymmy;

然后您可以再次阅读int