'std :: ostream'没有名为'close'的成员

问题描述 投票:1回答:2

std::ostream没有成员函数close()。我不应该关闭什么类型的流?

作为示例,也许我想关闭std::cout以防止对其进行任何进一步的写入。

std::cout.close(); // ‘std::ostream’ has no member named ‘close’

如果使用的是C库,则可以使用以下命令关闭stdout

fclose(stdout); // no problem

那么从close()中删除std::ostream成员背后的想法是什么?


相关:

c++ iostream
2个回答
3
投票

close()作为std::ostream的成员没有任何意义。第一个示例是std::ostringstream继承自std::ostream。闭合字符串有意义吗? std::ostream的唯一成员是用于输入/输出的全局对象。

文件流具有close()功能,因为将资源释放到环境中很重要。但是,由于从该基类继承的其他类不需要此函数,因此将其作为std::ostream的一部分没有任何意义,这就是为什么仅在文件流中使用它的原因。


0
投票

这里是一种伪造的方法:

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("");

真正的关闭将在对象被破坏时自动发出。

© www.soinside.com 2019 - 2024. All rights reserved.