【问题标题】:ifstream::is_open vs ifstream::fail?ifstream::is_open vs ifstream::fail?
【发布时间】:2014-07-28 15:41:06
【问题描述】:

阅读 Savitch 的 Problem Solving in C++,以std::ifstream::fail 为例,检查文件是否已正确打开(ifstreamofstream)。

我之前使用过 std::ifstream::is_open 来执行相同的检查,因为这是我第一次看到的内容。

哪个是“更好”的做法?

或者在尝试打开后直接调用其中任何一个的情况下,是否没有实际区别?

【问题讨论】:

  • 如果您认为有必要,请打开以标记建议。找不到合适的“最佳实践”或“编码风格”类型标签。

标签: c++ ifstream


【解决方案1】:

改用bool 转换运算符!

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

或者更好:

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

【讨论】:

  • 我不知道可以这样做。是什么让它变得更好?如果文件已打开但为空,是否返回 true?
  • @OllieFord 作为reference says,它本质上是!fail() 的一个很好的速写。这很好,因为它很容易记住并且它调用正确的函数来检查流是否正常。 (而不是eof()bad() 等)
  • 为什么第二个更好?
  • @AbhinavGauniyal 因为会为成功案例编写其余代码,因此您将不得不放置大量代码,但它的可读性会很差。所以最好只在失败条件下执行一些操作并编写你的其余代码而不需要额外的代码块
【解决方案2】:

简介

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 的事实。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2011-08-23
    相关资源
    最近更新 更多