std::ostream没有成员函数close()
。我不应该关闭什么类型的流?
作为示例,也许我想关闭std::cout
以防止对其进行任何进一步的写入。
std::cout.close(); // ‘std::ostream’ has no member named ‘close’
如果使用的是C库,则可以使用以下命令关闭stdout
:
fclose(stdout); // no problem
那么从close()
中删除std::ostream
成员背后的想法是什么?
相关:
close()
作为std::ostream
的成员没有任何意义。第一个示例是std::ostringstream
继承自std::ostream
。闭合字符串有意义吗? std::ostream
的唯一成员是用于输入/输出的全局对象。
文件流具有close()
功能,因为将资源释放到环境中很重要。但是,由于从该基类继承的其他类不需要此函数,因此将其作为std::ostream
的一部分没有任何意义,这就是为什么仅在文件流中使用它的原因。
这里是一种伪造的方法:
void ostream_fake_close( std::ostream & os )
{
os.flush();
static std::stringstream closed_flag;
cerr<<(os.rdbuf()==closed_flag.rdbuf()?"closed":"open")<<"\n";
os.rdbuf(closed_flag.rdbuf());
cerr<<(os.rdbuf()==closed_flag.rdbuf()?"closed":"open")<<"\n";
}
将来写入流将被重定向到closed_flag
缓冲区。您可以通过定期resetting限制缓冲区的大小:
closed_flag.str("");
真正的关闭将在对象被破坏时自动发出。