我有一个非托管c ++库,可以将文本输出到std :: ostream *。
我是从c#库使用的托管c ++包装器中调用它的。
目前,我向非托管代码传递一个指向std :: stringstream的指针,然后调用System.String(stringstream.str(。。c_str())将我的非托管缓冲区复制回.net友好字符串。
是否可以将.net Stream包装为stl std :: ostream *? - 允许我直接从非托管代码将文本流式传输到托管STREAM实现。
答案 0 :(得分:6)
如果我理解正确,您希望使用C ++标准流包装.NET流,以便您的本机代码流入C ++标准流,但数据最终会出现在.NET流中。
C ++ IO流大致分为流本身,它们执行C ++类型和二进制表示之间的所有转换,以及流缓冲,缓冲数据并从/写入设备。为了实现目标,您需要做的是使用写入.NET流的流缓冲区。为此,您需要创建自己的流缓冲区,该缓冲区派生自std::stream_buffer
,它在内部引用.NET流并将所有数据转发给它。这将传递给传递给本机代码的std::ostream
对象。
编写自己的流缓冲区不是初学者的任务,但也不是特别困难。在C ++ IO流上选择任何体面的参考(Langer/Kreft是你可以在纸上获得的最好的参考),找出你需要覆盖哪些虚拟函数才能做到这一点,并且你已经完成了。
答案 1 :(得分:2)
你可以这样做。只需创建一个派生自Stream的自定义类,并实现适当的方法。
在这种情况下,您需要将CanRead
设置为true,并至少实施Read
或ReadByte
。当你强加它们时,只需从本机端的输出流中读取。
这将允许您将本地ostream中的数据“流”化为.NET流,并且可以与.NET中的任何流读取器类一起使用。