文件读完后不能继续写文件的解决方法

#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。如果错误没有排除,那么结果就是相应的位又被置位了。

posted @ 2013-01-23 21:03  Tup  阅读(263)  评论(0)    收藏  举报