榛栗栗栗子 2022-03-24 15:45 采纳率: 100%
浏览 34
已结题

C++ io类 cin.clear() 和cin.sync()以及cin.ignore()的一点问题

代码:

#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复位后错误输入就进缓冲区了呢?亦或者我的这些理解是错的。

  • 写回答

1条回答 默认 最新

  • _GX_ 2022-03-24 17:20
    关注

    如果is.fail()返回true,那么先调用cin.ignore()是不起作用的,它直接返回,而先调用cin.clear()把is得状态复位到good状态,然后cin.ignore()才会忽略输入流后面的字符直到遇到换行符。

    https://en.cppreference.com/w/cpp/io/basic_istream/ignore

    ignore behaves as an UnformattedInputFunction.

    你再看看UnformattedInputFunction的要求
    https://en.cppreference.com/w/cpp/named_req/UnformattedInputFunction

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月1日
  • 已采纳回答 3月24日
  • 修改了问题 3月24日
  • 修改了问题 3月24日
  • 展开全部

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么