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; }
时间: 2024-10-11 10:32:44