狂奔的蜗牛 2016-01-06 00:45 采纳率: 0%
浏览 1749

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

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

  • 写回答

3条回答 默认 最新

  • ysuwood 2016-01-06 03:08
    关注

    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;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 运筹学中在线排序的时间在线排序的在线LPT算法
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧