64,676
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <stdexcept>
using namespace std;
void main()
{
int ival = 0;
while (cin >> ival, !cin.eof())
{
try {
if (cin.bad())
throw runtime_error("IO stream corrupted");
if (cin.fail()) {
cerr << "bad data, try again" << endl;
/* 用cin.clear()程序运行正常,为什么我将cin.clear()改成
* cin.clear(istream::failbit))之后输入一个字符,比如'a',
* 会陷入死循环,不断地输出"bad data, try again",不是failbit
* 错误标志已经被恢复正常了吗?还有,若将cin.clear()改成
* cin.clear(istream::failbit | istream::badbit),然后输入一个
* 字符'a',会陷入一个死循环,但是不断地输出"IO stream corrupted"呢?
*/
cin.clear(); // 改成cin.clear(istream::failbit)或
// cin.clear(istream::failbit | istream::badbit)
// 会出现两种不同的错误情况呢呢?
cin.sync();
continue; }
cout << "The twice of the varible is " << 2 * ival << endl;
} catch(runtime_error err) {
cout << err.what() << endl;
}
}
}
我用您的方法试了一下,不对啊。您可以试一下看。
不过我觉得您的这种个说法还是有点不对,
如果cin.clear(istream::failbit)把fail设成真,那么cinl.clear()是不是
把istream::failbit,eofbit,badbit都设成真了?
我刚刚拿书去翻阅了一下,我还是觉得我的说法是正确的。
我再看看其他大虾的意见看。不过还是谢谢你~
刚刚我将catch块加上了
catch(runtime_error err) {
cout << err.what() << endl;
cin.clear();
cin.sync();
}
这样,虽然在cin.clear(istream::failbit | istream::badbit)的情况下,
我输入字符,不会陷入死循环,但是会输出
"bad data, try again"
"IO stream corrupted"
可见,先出现了cin.fail(),后又抛出了一个runtime_error的错误,这是为什么啊?
您说的是正确的,刚刚非常抱歉。
我刚开始也太快地浏览了您的答案,我还以为你那个set是让我改成
setstate()函数呢~
我刚在网上查阅了一些资料后,终于发现什么原因了。
ios_base::clear(state)
将流s标志位设置为state,默认参数为goodbit
ios_base::setstate(state)
为流s添加指定的标志位state,原来的标志位仍然存在,相当于调用
clear(state | rdstate())
这个真的很容易搞混的。
如果我的程序那句代码改成:cin.clear(istream::failbit ^ cin.restate())
这样通过一个位运算就可以将条件状态的failbit位恢复了。这样就可以了。
为了避免错误,发现还是用cin.clear()比较好~