【问题标题】:Can you safely close a file that was never opened?你能安全地关闭一个从未打开过的文件吗?
【发布时间】:2015-10-09 16:18:50
【问题描述】:

如果我的std::ofstream 可能已打开或未打开,那么无论如何尝试close 是否安全?换句话说,如果!is_open()close() 会做任何令人讨厌的事情(抛出异常等)。例如

std::ofstream out;
if (some_condition)
{
    out.open(path, std::ios::out);
}

在我处理完文件后,我可以说

out.close();

或者我应该先检查一下

if (out.is_open())
    out.close();

cppreference上std::basic_fstream::close的唯一描述是

关闭相关文件。
有效地调用rdbuf()->close()。如果运行过程中出现错误,则调用setstate(failbit)

【问题讨论】:

  • 你可以让对象超出范围...
  • 一般来说我就是这样做的,这就是我喜欢std::ofstream的原因,但在这种特殊情况下,我希望文件比其他情况更早关闭。
  • 如果您在 cppreference 上查看 std::ofstream::close,您会看到使用了在未打开的文件上调用 close 的具体示例。总而言之,没有发生任何令人讨厌的事情,它只是设置了故障位,因此您之后尝试对 ofstream 执行的任何操作都可能导致问题。
  • @R_Kapp 这不是 cppreference
  • @Cubbi:……我的咖啡呢?

标签: c++ file-io error-handling ofstream


【解决方案1】:

它完全按照 cppreference 所说的去做:将设置故障位,您可以使用 fail() 方法对其进行检查。例如,以下打印“失败\n”:

#include <iostream>
#include <fstream>
int main(int argc, char ** argv)
{
        std::ofstream out;
        out.close();
        if (out.fail())
                std::cout << "fail" << std::endl;
        return 0;
}

在与操作系统的交互方面,没有什么可关闭的,但它是无害的。

【讨论】:

    【解决方案2】:

    来自 C++ 标准,§27.9.1.4 [filebuf.members],第 6 段:

    basic_filebuf&lt;charT,traits&gt;* close();
    效果:如果is_open() == false,返回一个空指针……

    【讨论】:

      【解决方案3】:

      是的,你可以一直close()文件,即使文件没有打开。 不管是LINUX还是Windows,我总是close(),不知道有没有打开。

      来自 LINUX:

      void
      close()
      {
           if (!_M_filebuf.close())
              this->setstate(ios_base::failbit);
      }
      

      【讨论】:

      • “来自 LINUX”你的意思是 libstdc++?
      • 是的。缩进是连线的,因为 libstdc++ 是这样格式化的
      • Linux 和 Windows 与它没有任何关系。问题是关于 C++ 的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 2020-12-05
      • 2014-02-12
      • 2012-06-01
      • 2013-12-16
      相关资源
      最近更新 更多