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

13

如果我有一个可能已经打开或未打开的 std::ofstream,尝试关闭是否安全?换句话说,如果 !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)


2
你可以让对象超出范围... - Sebastian Redl
1
通常我会使用std::ofstream,这也是我喜欢的原因,但在这种特殊情况下,我希望文件能够比预期更早地关闭。 - Cory Kramer
2
如果你在cppreference上查看std::ofstream::close,你会看到调用未打开文件的close的具体例子。简而言之,不会发生什么严重问题,只是设置了failbit,因此之后对ofstream进行的任何操作可能会引起问题。 - R_Kapp
3
@R_Kapp 那不是cppreference。 - Cubbi
@Cubbi:...我的咖啡在哪里? - R_Kapp
cppreference现在将rdbuf->close链接到filebuf close页面,后者更加详细。 - Cubbi
3个回答

13

它恰好执行了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;
}

就与操作系统的交互而言,没有需要关闭的,但除此之外是无害的。


8

根据C++标准,§27.9.1.4 [filebuf.members]的第6段:

basic_filebuf<charT,traits>* close();
   作用:如果is_open() == false,则返回null指针...


6

是的,你可以始终使用close()关闭文件,即使文件没有被打开。 无论是LINUX还是Windows,我总是不加思考地使用close()

来自LINUX:

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

你的意思是从LINUX中获取libstdc++库吗? - edmz
是的,缩进看起来很奇怪,因为libstdc++就是这样格式化的。 - user5405790
3
Linux 和 Windows 与此无关。问题是关于 C++ 的。 - user207421

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