2009-09-23 37 views
4

我有一个非托管的c + +库,输出文本到std :: ostream *。是否可以将.net流作为stl std :: ostream *进行封装?

我从c#库使用的托管C++包装器中调用此函数。

当前我将非托管代码传递给std :: stringstream的指针,然后再调用System.String(stringstream.str()。c_str())将我的非托管缓冲区复制回.net友好字符串。

是否可以将.net Stream作为stl std :: ostream *包装? - 允许我将文本直接从我的非托管代码流式传输到托管的STREAM实现。

回答

6

如果我理解正确,你想用C++ std流打包一个.NET流,以便你的本地代码流进入C++ std流,但数据最终在.NET流中。

C++ IO流大致分为流本身,它们完成C++类型和二进制表示之间的所有转换,以及缓冲数据并读写设备的流缓冲区。为了实现您的目标,您需要做的是使用写入.NET流的流缓冲区。为此,您需要创建自己的流缓冲区,该缓冲区源自std::stream_buffer,它在内部引用.NET流并将所有数据转发给它。这将传递给传递给本机代码的std::ostream对象。

编写自己的流缓冲区不是初学者的任务,但也不是特别困难。在C++ IO流上选择任何像样的引用(Langer/Kreft是您可以在纸上得到的最好的参考),找出您需要覆盖哪些虚拟函数来完成这些操作,然后就完成了。

+0

谢谢 - 这是有道理的 - 我错过了流缓冲区拆分。 – morechilli 2009-09-24 08:41:32

2

你可以这样做。只需创建一个衍生自Stream的自定义类,并实现适当的方法。

在这种情况下,您需要将CanRead设置为true,并至少执行ReadReadByte。当你推动它们时,只需从本地输出流中读取即可。

这将允许您将本地ostream中的数据“流式传输”到.NET流中,并且可以与.NET中的任何流式读取器类一起使用。

+1

我认为他需要它的另一种方式 - 所以这将是一个自'std :: ostream'派生的自定义类和包装'System.IO.Stream'。 – 2009-09-23 18:09:34

+0

当我读它时,不是100%确定。另外,从任何方向将数据从.NET流传输到本地流相当容易。 – 2009-09-23 19:13:14

相关问题