代码:
#include<iostream>
#include<fstream>
#include<sstream>
using namespace std;
istream& read(istream& is)
{
int c;
while (is >> c, !is.eof())
{
if (is.bad())
throw runtime_error("流已崩溃");
if (is.fail())
{
cerr << "遇到数据错误" << endl;
is.clear();
is.ignore(100, '\n');
//is.clear();
cout <<"是否复位成功?"<< is.fail() << endl;
continue;
}
cout << c;
}
is.clear();
return is;
}
int main()
{
read(cin);
system("pause");
return 0;
}
为什么,先clear再ignore程序没问题,而先ignore再clear就死循环了呢?我个人对读写这一块理解的比较含糊,就结果反推应一下,应该是没把cin::failbit复位的情况下,ignore并没有把错误的输入给清空掉,导致while循环下次读取时直接失败。能解释下该现象的原因吗?感谢!
又查了点资料,应该是没把cin::failbit复位前,错误的输入压根就没进入缓冲区,所以ignore也就没清除掉错误输入。而failbit复位后,从错误位置开始,后面的内容全部进入缓冲区,ignore处理范围足够大的清空下就能把它们清除掉。那进一步问一下,为什么failbit复位后错误输入就进缓冲区了呢?亦或者我的这些理解是错的。