开发者社区 问答 正文

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

在看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),错误状态一直清除不掉,为何?

展开
收起
a123456678 2016-03-09 09:39:51 2256 分享 版权
1 条回答
写回答
取消 提交回答
  • 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;
    }
    2019-07-17 18:55:23
    赞同 展开评论
问答分类:
C++
问答地址: