文件读完后不能继续写文件的解决方法
#include <iostream> #include <fstream> #include <cstdlib> using namespace std; int main(int argc,char** argv) { fstream file; file.open("F:\\tstBat\\a.txt",ios::in|ios::out); if(file.fail()) { cout<<"Open File Error!"<<endl; system("pause"); return 0; } char ch[256]; while(file>>ch) { cout<<ch<<endl; } cout<<"before clear():"<<endl; cout<<"failbit:"<<file.fail()<<endl; cout<<"badbit:"<<file.bad()<<endl; cout<<"eofbit:"<<file.eof()<<endl; cout<<"goodbit:"<<file.good()<<endl; file.clear(); cout<<"after clear():"<<endl; cout<<"failbit:"<<file.fail()<<endl; cout<<"badbit:"<<file.bad()<<endl; cout<<"eofbit:"<<file.eof()<<endl; cout<<"goodbit:"<<file.good()<<endl; file<<endl<<"END"; file.close(); system("pause"); return 0; }
解决方法就是:file.clear();
扩展:
badbit: to record a loss of integrity of the stream buffer. (流缓冲完整性被破坏)
eofbit: to record end-of-file while extracting from a stream. (到达数据流末尾)
failbit: to record a failure to extract a valid field from a stream. (提取数据域失败)
In addition, a useful value is goodbit, where no bits are set.
ios类定义了这四个常量badbit, eofbit, failbit, goodbit,其实这四个标志常量就是取对应标志位的掩码,也即输入的四种异常情况!
以上四个常量对应的取值为:
ios::badbit 001 输入(输出)流出现致命错误,不可挽回
ios::eofbit 010 已经到达文件尾
ios::failbit 100 输入(输出)流出现非致命错误,可挽回
ios::goodbit 000 流状态完全正常, 各异常标志位都为0
一般说来,badbit是一些系统底层或者硬件出错,比如文件系统错误,磁盘错误,网络错误等等。failbit就是其他软件错误,如试图从不能解析为整数的字符串里想要读一个整数等,顺便说下eof也会造成failbit被置位。
出错之后(不管是可挽回还是不可挽回)的结果是,之后的io操作统统不执行,因为这些操作都会有个if语句先判断这些错误位,如果被置位就直接返回了。
出错后可以用clear方法清除这些错误位,然后继续io。如果错误没有排除,那么结果就是相应的位又被置位了。

浙公网安备 33010602011771号