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

时间:2015-05-28 01:37:13

标签: c++ iostream

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

作为一个例子,也许我想关闭std::cout以防止进一步写入它。

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

如果我使用的是C库,我可以使用以下内容关闭stdout

fclose(stdout); // no problem

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

相关:

3 个答案:

答案 0 :(得分:3)

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

文件流具有std::ostream功能,因为能够将资源释放到环境中非常重要。但是,由于还有其他类从这个基类继承而不需要这个函数,因此它成为localhost:8000的一部分是不合理的。它仅用于文件流。

答案 1 :(得分: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("");

当物体被破坏时,将自动发出真实关闭。

答案 2 :(得分:0)

除了 Meneldal 的出色回答。

如果您稍后需要访问某些类型的资源,不释放资源仍然可能会导致问题。 如果由于某种原因您不想使用 ofstream(它有一个 close 方法),请坚持使用 ostream。你可以让它超出范围。

示例:

std::string FilePath = "C:/Test/MyFile.ext";

{  // <== Note the start of scope.

        // Writing a file using ostream as by example given by cplusplus.com reference.
        std::filebuf outfb;
        outfb.open(FilePath, std::ios::out);
        std::ostream os(&outfb);

        /* Do your stuf using 'os' here. */

}  // <== Note the end of scope.

/* Here, the resource is freed as if you would have called close. */
/* Rest of code... */

更新: 但是,现在我想一想,在这种情况下,std::filebuf 提供了 close 方法,它也可以解决您的问题。