"!file" 和 "!file.is_open()" 之间有什么区别?

4

if(!file)if(!file.is_open())有什么区别? 我用它们来检查文件是否已成功打开/读取。

#include<iostream>
#include<fstream>
using namespace std;

int main(){
ifstream file;

// first one
if (!file) 
   cout<<"File is not opened"<<endl;
else 
   . . .

//second one
if (!file.is_open()) 
   cout<<"File is not opened"<<endl;
else 
   . . .
}

3
!file.is_open是不规范的,你可能意思是 !file.is_open() - Timo
是的,抱歉,我忘记在后面写()了。 - abunehneh
如果打开失败,failbit 将被设置,因此对于打开来说测试是等效的。请参见 std::basic_ifstream<CharT,Traits>::basic_ifstream - David C. Rankin
2个回答

3
C++文档解释了operator!的作用:operator!

如果在相关联的流上发生错误,则返回true。具体来说,如果rdstate()中设置了badbitfailbit,则返回true

另一方面,is_open()函数的作用是:

检查文件流是否有关联文件。如果文件流有关联文件,则返回true,否则返回false

如果你想知道文件是否成功打开,请使用is_open()。这也更能表达你的意图。

2
如果您阅读文档,您会看到operator!返回是否发生了错误。而is_open返回流是否有关联的文件。这是两个非常不同的事情。

哇哦,它甚至还有 operator!。为什么它同时拥有 (bool and not)? - Timo
is_open 技术上返回函数地址。 - Stack Danny
@StackDanny 它返回 bool,所以不会返回地址。 - Jesper Juhl
@Timo operator bool 返回 !fail() - Jesper Juhl
那么您的意思是,如果要检查文件是否存在错误以打开它,我必须使用运算符!;如果要检查文件是否关联,那么我必须使用is_open()吗? - abunehneh
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接