#include <iostream>
#include <stdexcept>
using namespace std;
int main()
{
int ival;
while(cin >> ival , !cin.eof())
{
if(cin.bad())
{
throw runtime_error("IO stram corrupted");
}
if(cin.fail())
{
cerr << "bad data ,try again" << endl;
cin.clear(istream::failbit);
continue;
}
}
return 0;
}
相信有些初学C++的同学和我遇到同样的问题,就是按照书上的例子写完运行后发现输入字母后无限循环报错。
通过查询,发现出现问题的原因有两个:
1、cin.clear(istream::failbit)运行的结果是cin的状态还是failbit,理解一下cin.clear(istream::failbit)的用法:清除cin流,并设置failbit状态位
所以要想运行正确,这边的状态应该设置为:cin.clear()或者cin.clear(istream::goodbit)
2、在clear后,continue是会继续去读取字符,但是读取的字符都是从缓冲区读取的,因为之前输入的字符还在缓冲区,所以一直读缓冲区的
同一个字符,总是失败,这时需要做的就是发现失败后把缓冲区的字符清除,可以在clear()后添加几种方法的一种
a、cin.ignore(),不加参数的话一次清除一个字符,加参数的话cin.ignore(1024,'\n') 1024个字符,遇到换行符结束
b、string tem; getline(cin, tem); 这种办法就是利用getline方法读取缓冲区的字符然后清除了缓冲区。
还有其他的方法可以办到,最终的原理都是一样:清除缓冲字符。