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()可以清除现有的条件状态。我们习惯了在函数调用时判断是否成功,往往忽略了运算符<<和>>,表面上来看可能是文件写入总是失败,实际的原因可能是之前的某个操作导致的。
原文:http://www.cnblogs.com/zchongr/p/3773678.html