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

如果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