fstream对象重复使用时注意clear()的调用

      fstream对象重复使用时注意clear()的调用,否则会造成打开第二个文件失败。这是因为一个fstream对象对应磁盘上的
一个文件,这种绑定关系在调用open()函数或者构造函数时指定,但有时我们会重复使用同一个fstream对象先后绑定不同
文件,在两次绑定中间仅仅调用close()是不够的(当然对close()的调用是必须的,每次打开文件使用完毕都必须关闭文件),
因为close()函数并不会重置fstream的条件状态,如果先前的某个操作失败了,那么failbit的状态会一直保留下来,接下来
对于条件状态的判断也一定是失败的,因此在使用同一个fstream对象绑定第二个文件之间需要调用clear()函数重置流的条件
状态。

//y.txt不存在,x.txt存在
//注:此程序需在vs下运行才可得到理想结果,DEV应该是进行了优化,它的编译器应该是在将流对象与文件相关联时,自动重置了流状态 
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream fin("y.txt");
    if(fin.fail())                //由于y.txt不存在,因此failbit为1,fin.fail()返回true 
        cout<<"fail to open y.txt"<<endl;
    fin.close();

    fin.open("x.txt");            //由于x.txt存在,因此关联文件成功 
    cout<<fin.is_open()<<endl;    //打开文件成功,fin.is_open()返回true(注:如果x.txt不存在,则打开文件失败,返回false) 
    cout<<fin.bad()<<endl;        //并没有非法操作流,因此fin.bad()返回false 
    if(fin.fail())                //由于failbit为1,因此fin.fail()继续返回true 
        cout<<"fail to open x.txt"<<endl;
    fin.close();
    return 0;
}
原文地址:https://www.cnblogs.com/kevinq/p/4492206.html