如何创建自己的ostream / streambuf?

时间:2009-02-07 21:45:05

标签: c++ ostream streambuf

出于教育目的,我想创建一个ostream和流缓冲区来执行:

  1. 在执行<<<<< myVar的;
  2. 存储在deque容器中,而不是使用std:cout或写入文件
  3. 记录额外的数据,例如我做了多少次<<,我做了多少次.write,我写的字节数和flush()的次数。但我不需要所有的信息。
  4. 我试过重载但是失败了。我试着通过

    重载写入
    ostream& write( const char* s, streamsize n ) 
    

    在我的basic_stringstream2类中(我复制了将basic_stringstream粘贴到我的cpp文件中并对其进行了修改)但代码保持使用basic_ostream。我查看了代码,看起来我需要重载xsputn(这个页面上没有提到http://www.cplusplus.com/reference/iostream/ostream)但是我还需要重载多少?以及如何构建我的类(它需要继承什么等)?

3 个答案:

答案 0 :(得分:24)

规范方法包括定义自己的streambuf。 你应该看看:

答案 1 :(得分:6)

对于A + C)我认为你应该看一下方面,它们会修改对象作为字符的写法。您可以在此处存储统计信息以及流式传输对象的次数。 查看How to format my own objects when using STL streams?以获取示例。

对于B)您需要创建自己的streambuf并将ostream连接到该缓冲区(构造函数参数)。请参阅Luc's links + Deriving new streambuf classes。 简而言之,你需要为ostream(最小)实现这个:

  • 溢出(放置一个字符或刷新缓冲区)(link
  • xsputn(将char数组放入缓冲区)(link
  • 同步(link

答案 2 :(得分:1)

我不确定你想做什么是可能的。 <<运算符不是虚拟的。因此,您可以定义yourstream &operator << (yourstream &strm, int i)以使用endian转换和计数执行您想要的操作,并且当您的代码直接调用它时它将起作用。但是如果你将一个yourstream对象传递给一个需要ostream的函数,那么只要该函数调用<<,它就会转到原来的ostream版本而不是你的版本。

据我了解,已经设置了流设施,以便您可以“轻松”定义使用不同类型缓冲区的新流类型(例如,字符的deque),并且您可以非常轻松地通过<<添加对输出自己的类的支持。我不认为你打算重新定义它们之间的中间层。

特别是,<<界面的整个要点是提供格式良好的文本输出,而听起来你真的想要二进制输出。 (否则对“endian”的引用毫无意义。)即使假设有一些方法可以做到这一点我不知道,它最多会产生笨拙的二进制输出。例如,考虑最终用户过载以在3D空间中输出点。 <<的最终用户版本可能会执行<< '(' << x << ", " << y << ", " << z << ')'之类的操作。这在文本流中看起来很不错,但是在二进制流中浪费了很多并且完全无用的字符,理想情况下只使用<< x << y << z。 (对<<的调用次数应该算多少?)