输入输出流标志位无法清除

在看C++ PRIMER时的输入输出流一节中,看到流状态的标志位设置及清除时。
在调试流状态时,有一点未明白,下边是调试代码。

#include
#include
#include

using namespace std;

int main()
{
int itemp = 0;

while(cin >> itemp, !cin.eof())
{
    if(cin.bad())
        throw runtime_error("IO stream corrupted");

    if(cin.fail())
    {
        cerr << "bad data, try again" << endl;
        cin.clear();
        continue;
    }

    cout << itemp << endl;
}

return 0;

}

当输入数值型数据时,一切正常。但是输入字符数据时,程序进入死循环,一直输出
bad data, try again

用cin.clear(istream::failbit),错误状态一直清除不掉,为何?

clear 只是清除错误标志,但不能匹配的内容还在输入缓冲区里,下一次尝试还是会出错。
可以这样:

 #include <iostream>
using namespace std;
#include"stdio.h"
int main()
{
    int itemp = 0;
    while(cin >> itemp, !cin.eof())//ctrl+z退出
    {
        if(cin.bad())
        {
            throw runtime_error("IO stream corrupted");
        }

        if(cin.fail())
        {
            cerr << "bad data, try again" << endl;
            cin.clear();
            fflush(stdin); //增加清除缓冲区
            continue;
        }

        cout << itemp << endl;
    }

    return 0;
}

使用cin.clear()清除标志后,其输入缓冲区中的数据未进行清空的原因造成的后果。
在cin.clear()后使用cin.ignore(1024, '\n')清空cin中的缓冲区,问题解决。
cin.ignore()忽略cin中读取缓冲区中的内容,两个参数都是终止cin.ignore()的条件。
第一个参数是要忽略的字符个数,第二个参数匹配字符,遇到匹配字符,函数终止。

cin.clear(); // 错误位重置

cin.sync(); // 清空缓存区 如果不加这个函数就死循环了