回复 5楼 ljw970243
到家了,我想了一下,检测错误fail函数和bad函数是不一样的
当缓冲区出现错误,比如说数据丢失,badbit位设置为1,函数bad()检测到badbit位1,就返回真(1). 这样说明数据丢失,这种严重错误无法修复,
而fail函数是流操作失败,比如申请不到内存会出现其他输入错误才为1,这种不是致命错误,可以用clear()函数修复
至于为什么好好的fail函数会返回1呢?根据我的猜测是当读取到eof时函数将eofbit为1,同时将failbit也设置为1,这样做的目的是不能再对文件在读写修改,eofbit为1说明被读取过,如果要重复读取需要将各个标志清零,也就是clear()
说的明白点就是当函数检测到eof,自动将failbit设置为1,但不会将badbit设置为1,也就是说无论任何文件当检测到eof fail函数一定会返回1
除非清标志,既然这样如何判断读取错误呢?就用bad函数
程序代码:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc,char **argv)
{
ifstream ff;
char str;
int err=0;
ff.open(argv[1]);
if(!ff.is_open()){
cout<<"Cannot open file:"<<argv[1]<<endl;
return 0;
}
cout<<"Eof:"<<ff.eof()<<endl;
while(!ff.eof()) //这个我就不多说了
{
str=ff.get();
cout<<str; //测试看看是不是乱码,我测试一点问题都没
}
if(ff.fail()) // fail为1
{
if(ff.bad()) //看看bad标志是否为1,假设为1数据读写严重错误无法修复
{
err=ff.bad();
if(err)
{
cout<<"File read error, code:"<<err<<endl;
return 0;
}
}
ff.clear();
}
cout<<"Eof:"<<ff.eof()<<endl;
cout<<"Error code:"<<err<<endl;
ff.close();
return 0;
}
如果你觉得不满意,可以告诉我你在读写程序是不是要判断文本文件有错误字符还是什么?把你的想法告诉我也许可以帮助你,烧饼节快乐
[
本帖最后由 xg5699 于 2011-9-12 21:55 编辑 ]