分配给ostream后如何关闭ofstream?

dow*_*rme 5 c++ ofstream ostream

我可以

std::ostream& out = condition ? std::cout : std::ofstream(filename);
Run Code Online (Sandbox Code Playgroud)

但如果出现这种情况我该如何关闭out = std::ofstream(filename)

Naw*_*waz 6

忘记关闭一会儿,你的代码:

std::ostream& out = condition ? std::cout : of.open(filename);
Run Code Online (Sandbox Code Playgroud)

一开始就不会编译。std::ofstream::open()不返回流——它返回void. 您可以将其修复为:

std::ostream& out = condition ? std::cout : (of.open(filename), of);
Run Code Online (Sandbox Code Playgroud)

现在回到关闭流,好吧,您不必这样做,因为当流对象超出范围时(即调用析构函数时),析构函数将关闭文件流。所以它会自动为您完成 - 嗯,在 99.99% 的情况下,除非您正在做一些不寻常的事情,在这种情况下您想明确关闭它!


Iva*_*nko 5

据我了解,您想使用out?关闭文件流

您不需要显式关闭它。std::fstream是 RAII 对象,因此它将在封闭范围结束时自动关闭打开的文件。

当然,out如果您确实需要立即关闭文件,则可以随时进行强制转换:

if( ptr = dynamic_cast<std::ofstream*>(out) ) {
    ptr->close();
}
Run Code Online (Sandbox Code Playgroud)