24

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

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

我尝试过超载,但失败了。我尝试通过做重载写入

ostream& write( const char* s, streamsize n ) 

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

4

3 回答 3

26

规范方法包括定义您自己的流缓冲区。你应该看看:

于 2009-02-09T15:39:22.593 回答
7

对于 A+C)我认为您应该查看构面,它们修改了将对象写入字符的方式。您还可以在此处存储有关您流式传输对象的次数的统计信息。查看使用 STL 流时如何格式化我自己的对象?例如。

对于 B)您需要创建自己的 streambuf 并将您的 ostream 连接到该缓冲区(构造函数参数)。请参阅Luc 的链接+ Deriving new streambuf classes。简而言之,您需要为 ostream 实现此功能(最少):

  • 溢出(放置单个字符或刷新缓冲区)(链接
  • xsputn(将 char 数组放入缓冲区)(链接
  • 同步(链接
于 2009-08-28T07:07:33.890 回答
1

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

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

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

于 2009-02-09T14:55:57.283 回答