【发布时间】:2023-04-04 08:19:02
【问题描述】:
我可以的
std::ostream& out = condition ? std::cout : std::ofstream(filename);
但是如果是out = std::ofstream(filename),我该如何关闭?
【问题讨论】:
-
of.close(),或者让of超出范围。
我可以的
std::ostream& out = condition ? std::cout : std::ofstream(filename);
但是如果是out = std::ofstream(filename),我该如何关闭?
【问题讨论】:
of.close(),或者让of超出范围。
暂时忘记关闭,你的代码:
std::ostream& out = condition ? std::cout : of.open(filename);
开始时不会编译。 std::ofstream::open() 不返回流 - 它返回 void。您可以将其修复为:
std::ostream& out = condition ? std::cout : (of.open(filename), of);
现在回到关闭流,好吧,您不必这样做,因为当流对象超出范围时(即调用析构函数时),析构函数将关闭文件流。所以它会自动为你完成——好吧,在 99.99% 的情况下,除非你正在做一些不寻常的事情,在这种情况下你想明确地关闭它!
【讨论】:
std::ostream& out1 = std::cout; std::ostream& out2 = std::ofstream(""); 编译
std::ostream& out2 = std::ofstream(""); 不会在标准 C++ 中编译。您可能正在使用 MSVC++(允许此类代码)?
据我了解,您想使用out 关闭文件流?
您不需要明确关闭它。 std::fstream 是 RAII 对象,所以它会在封闭范围结束时自动关闭打开的文件。
当然,如果您现在确实需要关闭文件,您可以随时投射out:
if( ptr = dynamic_cast<std::ofstream*>(out) ) {
ptr->close();
}
【讨论】: