2012-01-17 48 views
1

我有用C語言編寫的代碼,我正致力於製作一個庫,從中我可以從其他語言訪問函數。在C++應用程序中使用C庫中的標準輸出

我正在爲此代碼編寫一個C++客戶端,以確定需要進行哪些更改才能將我的庫包括到C++應用程序中。

通常,基於C語言的二進制文件會分析某些輸入,然後通過一系列fprintf語句將其數據輸出到stdout

有沒有辦法將發送到stdout的相關C函數的輸出重定向?我不是C++專家,但我想我要做的是提供一個C++輸出流緩衝區(ostreamofstream?)的子類,它包含相同的輸出,否則這些輸出將由相關的C功能爲stdout

我希望將這些數據重定向到文件流或C++應用程序中的標準輸出,如果可能的話。

我該怎麼做?我可以保留我的C代碼原樣並從C++代碼中重定向stdout嗎?

EDIT

我可以在問題編輯C的功能,從而使一個文件指針或描述符是一個參數。這會有幫助,能夠通過輸出的地方嗎?我不清楚的是如何翻譯C++ IO和CIO。我無法將C++ iostream傳遞給C函數,或者我可以嗎?

+0

在某些系統(特別是Linux)上,來自C++的'stdout'和來自C++的'std :: cout'是「同步的」。你總是可以在C++代碼中使用''頭來獲得'stdout'的C概念。 – 2012-01-17 12:31:52

+0

因此,如果我設置了'FILE * fp = stdout'並且有一個將數據吐出到'stdout'的C函數'foo(FILE * fp)',那麼我會怎麼做將輸出從'std :: cout'重定向到輸出流是(仍然)'std :: cout'還是文件輸出流? – 2012-01-17 12:38:04

+0

C函數不知道C++'std :: cout'!但請參閱http://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/manual/manual/io_and_c.html – 2012-01-17 12:42:05

回答

0

您需要設置一個pipe,並將C程序作爲獨立進程運行,其stdout連接到管道的輸入端。您的C++程序需要從管道的輸出端讀取數據,然後它將從C進程獲取所有輸出。

更新:在downvotes和評論之後,我重新閱讀了一些問題。我(現在)意識到C代碼是作爲一個庫運行的,即鏈接到與C++代碼相同的可執行文件中。

我不認爲你可以在不影響C++程序的輸出流的情況下強制重定向C代碼的標準輸出,這似乎是一個非常高的代價才能建立一個庫。

我仍然認爲解決方案是在自己的進程中「沙箱」C代碼,並重定向輸出,然後您可以根據需要進行讀取。將C功能重寫爲return結果而不是打印它們當然更好,但我認爲這不是一種選擇。

你說C代碼使用fprintf(),即具有顯式文件句柄的變體,所以也許你可以使用它並使它從外部接受FILE *,在這種情況下,你可以給它一個管道而不必子過程呢。

對看到其他答案很感興趣,也許有一種方法我錯過了。

更新2:如果你要控制你傳遞到C庫,FILE *的機會,那麼它很簡單:

  • 要使輸出顯示與C++程序的普通輸出,只是通過在stdout
  • 要將輸出捕獲到一個文件中,請將該文件fopen()並傳入產生的FILE *

如果你想要做兩個在同一時間,這再次有點麻煩。在這種情況下,我會再次推薦一個管道或套接字,以便C++端負責讀取C庫生成的輸出,並根據需要執行它的操作。

+0

但Alex Reynolds寫了關於他的C *庫*,而不是C程序! – 2012-01-17 12:33:35

+0

這不是我所追求的。我正在編寫一個庫,所有這些都需要在應用程序中完成。 – 2012-01-17 12:33:45

+0

**單獨使用管道和套接字運行C程序並不是我所追求的。**我正在編寫一個**庫**,所以這一切都需要使用應用程序完成。 – 2012-01-17 12:56:52

0

如果我理解正確的問題,沒有,至少有符合標準的代碼。

可能相關的是std :: ios_base :: sync_with_stdio,它可以確保某些C++流上的IO與C流的IO make正確同步。所以stdout與cout,stdin和cin和stderr寬度cerr同步。但是,這並不是爲了允許更改cout中的streambuf,並將更改傳播到stdout(這是我理解您的請求的方式),並且如果您在stdout上執行freopen操作,我無法確定如何使用效果。