std::ofstream 是否保证如果打开新文件,旧的打开文件将被关闭?

Does std::ofstream guarantee the old open file will be closed if opening new one?

提问人:xmllmx 提问时间:5/10/2021 最后编辑:xmllmx 更新时间:5/10/2021 访问量:165

问:

#include <fstream>

int main()
{
    auto fout = std::ofstream("/tmp/a.txt");
    fout.open("/tmp/b.txt"); // Will "/tmp/a.txt" be closed?
    fout.open("/tmp/c.txt"); // Will "/tmp/b.txt" be closed?
}

如果打开新文件,是否保证旧的打开文件将被关闭?std::ofstream

C++ C++11 标准 文件处理 IOSTREAM

评论

1赞 paddy 5/10/2021
我没有看到任何明确的行为规范。 实质上是将调用传递到其原始设备缓冲区。这方面的文档没有具体说明如果另一个文件已经打开会发生什么,也没有具体说明如果打开文件但打开失败会发生什么。但是,您至少应该预期,如果在该对象上打开新文件,则旧文件将被关闭,因为设备缓冲区负责管理单个资源,并且不会泄漏资源。ofstream::openopen
0赞 NathanOliver 5/11/2021
只是想听听,因为你删除了你的另一个Q。在 C++20 中,比较得到了重大更新,其中之一是应该向前和向后工作。这意味着,当您希望 LHS 和 RHS 是不同的类型时,您不再需要编写两个重载。operator ==

答:

3赞 Igor Tandetnik 5/10/2021 #1

第二次和后续调用将失败。

[filebuf.members]

2 效果: 如果 ,返回一个空指针。否则。。。
basic_filebuf* open(const char* s, ios_base::openmode mode);is_open() != false

[ofstream.members]

3 效果:调用 .如果该函数不返回 null 指针 调用 ,否则调用
void open(const char* s, ios_base::openmode mode = ios_base::out);rdbuf()->open(s, mode | ios_base::out)clear()setstate(failbit)