按照《C++ Primer》使用cin.fail()时出现了死循环
代码如下,如果输入
2
3
ab
则会无限循环,怎么回事?如何解决?编译器是VS 2008
c++ cin.fail()
#include <iostream>
using std::runtime_error;
using std::cerr;
using std::cin;
using std::cout;
using std::endl;
void keep_window_open();
int main()
{
int ival;
// read cin and test only for EOF; loop is executed even if there are other IO failures
while (cin >> ival, !cin.eof())
{
try
{
if (cin.bad()) // input stream is corrupted; bail out
throw runtime_error("IO stream corrupted!");
}catch(runtime_error err)
{
cout<<err.what()<<endl;
}
if (cin.fail()) // bad input
{
cerr<< "bad data, try again: "; // warn the user
cin.clear(std::istream::failbit); // reset the stream
continue; // get next input
}
// ok to process ival
}
keep_window_open();
}
void keep_window_open()
{
cout << "\nPress any key to exit:";
getchar();
}
[解决办法]
while (!cin.eof(),cin>>ival) 试下
[解决办法]
饿,看错了- - 忽视我吧
[解决办法]
这该是vs的一个bug吧,cin.clear(std::istream::failbit);竟然没有重置掉流的状态,所以,下次检测一直cin.fail()为真,就死循环了。。。。
这个是primer上例子,代码应该没有问题的,那么就是vs问题了,我是vs2010,一样的死循环!!!
[解决办法]
这是PRIMER上的一个错误例子, 这个例子在论坛里每个月要被提起N次, 无奈了.
clear是设置状态, 不是清空状态, 自己看cplusplus:http://www.cplusplus.com/reference/ios/ios/clear/
[解决办法]
在cin.clear 后面加一句cin.ignore();
哦了
[解决办法]
哦。。。还有个地方忘了说
failbit 请改成 goodbit
[解决办法]
没错 所以要改的话 是设置为goodbit才对
[解决办法]
俄,原来如此.反正我第一次听说.哈哈,又学到一手!
[解决办法]
我是这样想的,你这里毕竟输入了一个错值,所以如果你不处理的话,即使你设置了流的状态,下次判断还会出错,所以,你要在后面加上跳过这个字符的语句,比如cin.get()或者cin.ignore()等,这样就没问题了哈.快给分..