ifstream::is_open vs ifstream::fail?

32

阅读Savitch的 C++问题解决std::ifstream::fail 被用作检查文件是否已正确打开( ifstreamofstream)的示例。

我之前使用的是首先显示的std::ifstream::is_open 执行相同的检查。

哪种做法更好?

或者在尝试打开后直接调用任何一个时,实际上没有区别吗?


如果您认为必要,欢迎提出标签建议。我找不到一个合适的“最佳实践”或“编码风格”类型的标签。 - OJFord
2个回答

33

介绍

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

13

请使用bool转换运算符!

ifstream i("test.txt");
if (i) {
    //success
}

或者更好:

ifstream i("test.txt");
if (!i) {
    //failure, handle error
}

我不知道那可以被做到。是什么让它更好?如果文件已经打开但是为空,它会返回true吗? - OJFord
3
根据参考资料,它基本上是!fail()的简写形式。这很好,因为易于记忆并调用正确的函数来检查流是否正常(而不是使用eof()bad()等)。 - Csq
为什么第二个更好? - Abhinav Gauniyal
2
@AbhinavGauniyal 因为成功情况下的代码块会更长,因此你需要在条件语句中编写大量代码,但这会降低代码可读性。所以最好只在失败条件下执行少量操作,并且在没有额外代码块的情况下编写其余代码。 - FreePhoenix888

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