#include<iostream>
using namespace std;
int main()
{
int num;
while(cin>>num,!cin.eof())
{
if(cin.bad())
throw runtime_error("IO stream corrupted!");
if(cin.fail())
{
cerr<<"bad data ,try again"<<endl;
cin.clear(istream::failbit);
cin>>num;
continue;
}
}
system("pause");
return 0;
}
为什么这个程序运行起来如果输入字符串或者是字符,会一直循环呢?我在if(cin.fail()){...}循环里边加的cin>>num难道没作用吗?求解释,不理解。为什么这个程序运行起来如果输入字符串或者是字符,会一直循环呢?我在if(cin.fail()){...}循环里边加的cin>>num难道没作用吗?求解释,不理解。最初的问题:为什么这个程序运行起来如果输入字符串或者是字符,会一直循环呢?我在if(cin.fail()){...}循环里边加的cin>>num难道没作用吗?
意图:num是int类型的,但是输入的时候我要是输入字符串类型的话,我想利用istream流里边的cin的方法,把这个错误检测出来,并提示再次输入,就实现这个
。。。。。。。
#include<iostream>
using namespace std;
int main()
{
int num;
while(cin>>num,!cin.eof())
{
if(cin.bad())
throw runtime_error("IO stream corrupted!");
if(cin.fail())
{
cerr<<"bad data ,try again"<<endl;
cin.clear(istream::goodbit);//将状态置为可用的,也可以用cin.clear()
cin.ignore(1024,'\n');//这样该是表较好的,第一个参数最好比较大
cin>>num;
continue;
}
}
return 0;
}
上边是正确的版本,首先说下cin.clear(),当调用cin.clear()不带参数的时候是把所有的都改为可用,cin.clear(istream::goodbit);
但是如果程序只写这一个clear的话还是不行,因为虽然状态改变了,但是下回检测cin.fail()的时候还是会置成failbit,因为错误的那几位还在流中,clear()方法不是清空流中的数据,而是当cin发生错误的时候将相应的位置置成failbit,所以要解决跳出死循环问题,就需要使用到了后来的ignore()方法了,原型:istream &ignore( streamsize num=1, int delim=EOF );
当不带参数的时候默认参数num=1,delim=EOF,作用就是忽略输入流中前num个字符,直到遇到遇到中止或者'\n',然而我们每次输入相应的变量后都会使用回车讲数据传入到流当中所以clear()或者clear(istream::goodbit)后边加上ignore就就将错误的输入信息忽略屏蔽掉,也就不会进入到死循环然后跳到最外边的while循环,从此就实现了我要的功能了,同时cin对于终端进入到流中的数据是一位一位的检测的。