IO标准库一系列的条件状态成员,用来标记给定的IO对象是否处于可用的状态,或者碰见的哪些特定的错误。换句话说,就是输入年龄时候,输入了一个英文字符,跟输入的一定关系都没有的时候,会出现错误。Cin>>m_age; C++会直接跳出,对此,条件状态就有用了。
fail()中检测的是badbit和failbit这两个标志位,而bad()中检测的是badbit标志位。
badbit表示的是一种系统级的错误,比如流缓冲区完整性的缺失等,是无法恢复的。
failbit表示读取数据时失败,比如已经读到最末尾了等,它是可恢复的。
#include "iostream"
using namespace std;
void check_cin_state(istream& is)
{
if (is.bad())
{
cout << "cin bad()" << endl;
}
else
{
cout << "cin not bad()" << endl;
}
if (is.fail())
{
cout << "cin fail()" << endl;
}
else
{
cout << "cin not fail" << endl;
}
/*****返回输入流结束位,即按下"ctrl" + "z"键********/
if (is.eof())
{
cout << "cin eof()" << endl;
}
else
{
cout << "cin not eof()" << endl;
}
if (is.good())
{
cout << "cin good()" << endl;
}
else
{
cout << "cin not good()" << endl;
}
}
int main()
{
cout << "检查cin 的状态:" << endl;
check_cin_state(cin);
cout << "输入一个整数" << endl;
int n;
cin >> n;
cout << "再检查一下cin的状态" << endl;
check_cin_state(cin);
return 0;
}
#include "iostream"
using namespace std;
int main()
{
int sum = 0, value;
while (cin >> value)
{
sum += value;
cout << "sum is " << sum << endl;
}
return 0;
}
这里的输入数字是有效的,当输入字母的时候,就退出了程序。
#include "iostream"
using namespace std;
int main()
{
int sum = 0, value;
while (cin >> value,!cin.eof())
{
if (cin.bad())
{
throw std::runtime_error("IO stream corrupted");
}
if (cin.fail())
{
cerr << "bad data,try again" << endl;
/*****恢复流的状态****/
cin.clear();
/*****换行符前面的200字符清除掉*********/
cin.ignore(200, '\n');
continue;
}
sum += value;
cout << "sum is" << sum << endl;
}
return 0;
}