2009-09-23 36 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

相關問題