C++基础 - IO对象(流对象)状态,置位与复位

IO对象(流对象)不能拷贝和赋值,只能以引用的方式传递和返回

    // IO对象(流对象)不能拷贝和赋值,只能以引用的方式传递和返回
    ofstream out1, out2;
    out1 = out2; // 错误,不能对流对象赋值
    ofstream print(ofstream); // 错误,不能初始化流对象参数
    out2 = print(out2); // 错误,不能拷贝流对象

IO对象(流对象)状态

确定一个流对象的状态的最简单方法是将它当作一个条件来使用,我们将流当作条件使用的代码等价与 !fail()。注意,eof 和 bad 操作只能表示特定的错误,不过一旦被置位,则failbit同样会被置位(即失败状态),因此,使用good() / fail() 是确定流总体状态的正确方法。

    while(cin >> value) {
        ...
    }

IO对象(流对象)置位(表示错误)与复位(清除)

void printState(istream& in) {
    // 流状态打印
    cout << "goodstate: " << in.good() << ", goodbit: " << in.goodbit << endl;
    cout << "failstate: " << in.fail() << ", failbit: " << in.failbit << endl;
    cout << "eofstate: " << in.eof() << ", eofbit: " << in.eofbit << endl;
    cout << "badstate: " << in.bad() << ", badbit: " << in.badbit << endl;
    cout << endl;
}
void baseIOStateTest(){    
    // IO对象(流对象)状态
    int value;
    while(cin >> value) {
        printState(cin);
    }
    
    auto old_state = cin.rdstate(); // 读取当前状态并记录
    printState(cin);
    
    cin.clear(); // 流状态复位,即错误位全部清除
    printState(cin);
    
    cin.setstate(old_state); // 设置为原来错误状态,导致failbit置位
    cin.clear(cin.rdstate() & ~cin.failbit); // 流状态复位,failbit复位
    printState(cin);
    
    cin.setstate(old_state); // 设置为原来错误状态,导致failbit置位
    cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit); // 流状态复位,failbit和badbit复位
    printState(cin);
    
    cin.setstate(old_state); // 设置为原来错误状态,导致failbit置位
    printState(cin);
    
    int temp = 0;
    return;
}

结果截图

参考 

C++ primer中文版 第五版 第8章

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值