你能安全地关闭一个从未打开过的文件吗?

Can you safely close a file that was never opened?

如果我有一个 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 的唯一描述是

Closes the associated file.
Effectively calls rdbuf()->close(). If an error occurs during operation, setstate(failbit) is called.

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

basic_filebuf<charT,traits>* close();
   Effects: If is_open() == false, returns a null pointer.…

是的,您始终可以close() 文件,即使文件未打开。 不管LINUX还是Windows,我总是close()不去想它们是否打开了。

来自LINUX:

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

它完全按照 cppreference 所说的那样进行:将设置 failbit,您可以使用 fail() 方法检查它。例如,以下打印 "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;
}

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