首页 > 代码库 > fstream条件状态

fstream条件状态

    fstream对象在做大部分操作时都应注意对返回结果或条件状态做判断,诸如seek、>>、open之类的操作都可能失败,一旦失败后,条件状态将被置位,该流就处于被破坏的状态,后续的操作可能都会失败,例如:

 1 #include <fstream>
 2 #include <iostream>
 3 
 4 int _tmain(int argc, _TCHAR* argv[])
 5 {
 6     std::fstream fdata("file.tmp", std::ios_base::in|std::ios_base::app);
 7     if(!fdata){
 8         std::cerr<<"failed to open file!";
 9         return -1;
10     }
11 
12     if(!fdata.seekg(0)){
13         std::cerr<<"failed to seek file!";
14         return -1;
15     }
16     
17     int nTotal = 0;
18     int nCorrect = 0;
19 
20     fdata>>nCorrect>>nTotal;
21     std::cout<<nCorrect<<"/"<<nTotal<<std::endl;
22     fdata<<nCorrect<<" "<<nTotal<< std::endl;
23 
24     return 0;
25 }

    如果要打开的文件file.tmp不存在,第20行首次打开文件后由于试图读取不存在的数据,就导致操作不成功。后续写入操作(第22行)也会失败。第20行应修改为:

20     if(!(fdata>>nCorrect>>nTotal)){
21         fdata.clear();
22     }

fstream维护了一组条件标志,通过这些标志可以监控留的当前状态。可以调用四个谓词成员函数来判断:

1、如果一个流遇到文件结束符,则eof()返回true。
2、如果试图做一个无效操作,比如seeking超出了文件尾,则bad()返回true。
3、如果操作不成功,如打开文件流对象失败或者遇到无效的输入格式,则fail()返回true。
4、如果其他条件都不为true,则good()返回true。

调用clear()可以清除现有的条件状态。我们习惯了在函数调用时判断是否成功,往往忽略了运算符<<和>>,表面上来看可能是文件写入总是失败,实际的原因可能是之前的某个操作导致的。