出于教育目的,我想创建一个ostream和stream buffer来完成以下工作:
我尝试了重载,但失败得很可怕。我尝试通过执行以下操作重载write
ostream& write( const char* s, streamsize n )
在我的basic_stringstream2类中(我将paste basic_stringstream复制到cpp文件中并对其进行了修改),但代码仍然使用basic_ostream。我看了看代码,看起来我需要重载xsputn (在这个页面http://www.cplusplus.com/reference/iostream/ostream中没有提到),但是我还需要重载什么呢?我如何构造我的类(它需要继承什么,等等)?
发布于 2009-02-09 15:39:23
规范方法包括定义您自己的streambuf。你应该看看:
的应用程序示例)
发布于 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)
)
发布于 2009-02-09 14:55:57
我不确定你想做的事情是不是可能。<<
运算符不是虚拟的。因此,您可以定义yourstream &operator << (yourstream &strm, int i)
来执行您想要的字节顺序转换和计数,并且当您的代码直接调用它时,它将工作。但是,如果您将一个yourstream对象传递给一个需要ostream的函数,那么每当该函数调用<<
时,它都会转到原始的ostream版本,而不是您的版本。
据我所知,streams工具已经设置好了,这样您就可以“轻松地”定义一个使用不同类型的缓冲区的新的流类型(例如,字符队列),并且您可以非常容易地添加对通过<<
输出您自己的类的支持。我不认为你打算重新定义它们之间的中间层。
尤其是,<<
接口的全部目的是提供格式良好的文本输出,而听起来您实际上想要的是二进制输出。(否则,引用"endian“就没有任何意义了。)即使假设有某种方法可以做到这一点,我也不知道,它最多只能产生笨拙的二进制输出。例如,考虑最终用户在3D空间中输出点的过载。最终用户版的<<
可能会执行类似<< '(' << x << ", " << y << ", " << z << ')'
的操作。这在文本流中看起来很不错,但它在二进制流中有很多浪费且完全无用的字符,理想情况下只使用<< x << y << z
。(对<<
的调用应计为多少次?)
https://stackoverflow.com/questions/524641
复制相似问题