c++判断文件打开是否成功ifstream a("b.txt") ;if(!a)和if(!a.is_open())等价吗?

已经调试过了是正确的,是等价的,为什么是等价的呀,难道ifsream对象默认的是a.is_open()吗??

if(a.fail())
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;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-10-11
if(!a) -- 测定 对象 a 是否 建立/存在.

if(!a.is_open()) -- 测定 输入流文件对象 a 是否 正确被打开.

判断文件打开是否 失败,两者都可以.
第2个回答  2022-07-03

实验证明,只有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;

运行结果:


win7,vc6.0

结果可见,当第一次打开文件失败之后,fail的返回值和good的返回值就不再变化了,以及inn的值也是如此,只有is_open()函数的返回值是准确的。

相似回答