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

已经调试过了是正确的,是等价的,为什么是等价的呀,难道ifsream对象默认的是a.is_open()吗??... 已经调试过了是正确的,是等价的,为什么是等价的呀,难道ifsream对象默认的是a.is_open()吗?? 展开
 我来答
HelloScrollBar
2009-10-11 · 超过22用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:0
展开全部
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;
}
L_o_o_n_i_e
2009-10-11 · TA获得超过4.2万个赞
知道大有可为答主
回答量:8507
采纳率:38%
帮助的人:5252万
展开全部
if(!a) -- 测定 对象 a 是否 建立/存在.

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

判断文件打开是否 失败,两者都可以.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阳光下的平凡66
2022-07-03 · 贡献了超过181个回答
知道答主
回答量:181
采纳率:33%
帮助的人:1.9万
展开全部

实验证明,只有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()函数的返回值是准确的。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式