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章