c++判断文件打开是否成功ifstream a("b.txt") ;if(!a)和if(!a.is_open())等价吗?
if(!a.good())
if(!a)
上面3个等价
但上面的无法检测到 : 以不合适的文件模式打开文件失败
a.is_open()可以检测到这个错误
所以推荐使用 if(!a.is_open())
////////////////////////////////////////////////////
ifsream对象默认的是a.is_open()这句话说的不对
应该讲:ifstream对象被隐式转化成bool型
a.is_open()也返回bool型
/////////////////////////////////////////////////////////////
下面是我搜索的
ifsream父类中有类型转换函数//
类型转换函数的定义:
operator void *() const {
if(state&(badbit|failbit) )
return 0;
return (void *)this;
}
if(!a.is_open()) -- 测定 输入流文件对象 a 是否 正确被打开.
判断文件打开是否 失败,两者都可以.
实验证明,只有is_open()函数判断文件打开状态是准确的,其他的都不准确。
看下面的简单代码,以及运行结果:
//初始状态
ifstream inn;
cout<<inn<<","<<inn.fail()<<","<<inn.good()<<","<<inn.is_open()<<endl;
//dd2.txt文件不存在,不能打开成功
inn.open("dd2.txt");
cout<<inn<<","<<inn.fail()<<","<<inn.good()<<","<<inn.is_open()<<endl;
//dd.txt文件存在,能打开成功
inn.close();
inn.open("dd.txt");
cout<<inn<<","<<inn.fail()<<","<<inn.good()<<","<<inn.is_open()<<endl;
//dd2.txt文件不存在,不能打开成功
inn.close();
inn.open("dd2.txt");
cout<<inn<<","<<inn.fail()<<","<<inn.good()<<","<<inn.is_open()<<endl;
//dd.txt文件存在,能打开成功
inn.close();
inn.open("dd.txt");
cout<<inn<<","<<inn.fail()<<","<<inn.good()<<","<<inn.is_open()<<endl;
运行结果:
结果可见,当第一次打开文件失败之后,fail的返回值和good的返回值就不再变化了,以及inn的值也是如此,只有is_open()函数的返回值是准确的。