阅读Savitch的 C++问题解决,std::ifstream::fail
被用作检查文件是否已正确打开( ifstream
或ofstream
)的示例。
我之前使用的是首先显示的std::ifstream::is_open
执行相同的检查。
哪种做法更好?
或者在尝试打开后直接调用任何一个时,实际上没有区别吗?
std::ifstream::fail
包含对 std::ifstream::is_open
的检查,但是 std::ifstream::is_open
仅检查是否能够创建文件句柄。
std::ifstream::fail
可以返回 true,即使 std::ifstream::is_open
返回 true;它们并不互斥。
.fail
将会检查流的整体 "健康" 状况,包括检查流是否因为试图读取无效的值而进入了 失败状态。而 .is_open
仅检查流是否当前附加到文件上,.is_open
不在意流是否处于 失败状态。
这当然取决于你想要实现什么目标。
通常建议使用explicit operator bool ()
来判断流是否可以被读取/写入,这将包括检查流的整体健康状况。
我们可以在 some_stream
上进行另一个读/写操作吗?
if (some_stream) {
// stream is alive and well
} else {
// something is wrong
}
如果您明确想知道某个fstream是否实际附加到文件上,请使用is_open
,如果要检查整体健康状况,请使用.fail
或者依赖于流可转换为bool
的事实。
is_open()
和fail()
之间的区别,但仍未回答OP的主要问题:在文件流对象创建后立即使用两者是否有任何区别。具体而言,当在文件流创建后立即使用fail() && is_open()
时,是否存在并且是什么情况。 - Alex Che请使用bool
转换运算符!
ifstream i("test.txt");
if (i) {
//success
}
或者更好:
ifstream i("test.txt");
if (!i) {
//failure, handle error
}