首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何创建自己的ostream/streambuf?

如何创建自己的ostream/streambuf?
EN

Stack Overflow用户
提问于 2009-02-07 21:45:05
回答 3查看 26.5K关注 0票数 24

出于教育目的,我想创建一个ostream和stream buffer来完成以下工作:

  1. 修复执行<< myVar时的字节顺序;
  2. 存储在双端容器中而不是使用std:cout或写入文件
  3. 会记录额外的数据,例如我执行<<的次数、执行.write的次数、写入的字节数以及刷新的次数()。但我不需要所有的信息。

我尝试了重载,但失败得很可怕。我尝试通过执行以下操作重载write

代码语言:javascript
复制
ostream& write( const char* s, streamsize n ) 

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-09 15:39:23

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

的应用程序示例)

票数 26
EN

Stack Overflow用户

发布于 2009-08-28 07:07:34

对于A+C)我认为你应该看看facet,它们修改了对象被写成字符的方式。你也可以在这里存储你的对象流传输次数的统计信息。有关示例,请查看How to format my own objects when using STL streams?

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

(link)

  • xsputn (将字符数组放入buffer)(link)

)

  • overflow (放置单个字符或刷新缓冲区)
票数 7
EN

Stack Overflow用户

发布于 2009-02-09 14:55:57

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

据我所知,streams工具已经设置好了,这样您就可以“轻松地”定义一个使用不同类型的缓冲区的新的流类型(例如,字符队列),并且您可以非常容易地添加对通过<<输出您自己的类的支持。我不认为你打算重新定义它们之间的中间层。

尤其是,<<接口的全部目的是提供格式良好的文本输出,而听起来您实际上想要的是二进制输出。(否则,引用"endian“就没有任何意义了。)即使假设有某种方法可以做到这一点,我也不知道,它最多只能产生笨拙的二进制输出。例如,考虑最终用户在3D空间中输出点的过载。最终用户版的<<可能会执行类似<< '(' << x << ", " << y << ", " << z << ')'的操作。这在文本流中看起来很不错,但它在二进制流中有很多浪费且完全无用的字符,理想情况下只使用<< x << y << z。(对<<的调用应计为多少次?)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/524641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档