2012-01-17 15 views
1

私は他の言語の関数にアクセスできるライブラリを作るためにC言語で書かれたコードを用意しています。C++アプリケーションでのCライブラリの標準出力の使用

私は現在、このコードにC++クライアントを作成しています。私のライブラリをC++アプリケーションに組み込むためのサポートを提供するために必要な変更を把握しています。

通常、Cベースのバイナリはいくつかの入力を解析し、そのデータを一連のfprintfステートメントを介してstdoutに出力します。

関連するC関数の出力をstdoutにリダイレクトする方法はありますか?

私はC++エキスパートではありませんが、私はC++出力ストリームバッファ(ostreamofstream?)のサブクラスを提供したいと思います。 Cの機能はstdoutです。

可能であれば、このデータをファイルストリームまたはC++アプリケーション内の標準出力にリダイレクトするオプションを希望します。

どうすればよいですか? Cコードをそのままにして、stdoutをC++コードからリダイレクトすることはできますか?ファイルポインタまたは記述子が引数になるように、私は、問題のC関数を編集することができ

EDIT

。これが助けになるのでしょうか。私には分かりませんが、C++ IOとC IOをどのように翻訳するかです。私はC++ iostreamをC関数に渡すことはできませんか?

+0

一部のシステム(Linuxなど)では、Cの 'stdout'とC++の' std :: cout'は "同期"しています。また、C++コードで ''ヘッダを使うと、 'stdout'というCの概念を得ることができます。 –

+0

'FILE * fp = stdout'を設定し、データを' stdout'に吐き出す 'foo(FILE * fp)'関数を持っていれば、 'std :: cout'の出力を(まだ) 'std :: cout'またはファイル出力ストリームのどちらかの出力ストリーム? –

+0

C関数はC++の 'std :: cout'を知らない! http://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/manual/manual/io_and_c.html –

答えて

0

pipeをセットアップして、stdoutをパイプの入力端に接続してスタンドアロンプ​​ロセスとしてCプログラムを実行する必要があります。あなたのC++プログラムは、パイプの出力側から読み込む必要があり、Cプロセスからのすべての出力を取得します。

更新日:私は、下線とコメントの後にもう少し質問を再読しました。私はCコードがライブラリとして実行されていること、つまりC++コードと同じ実行可能ファイルにリンクされていることを認識しています。

私は、C++のプログラムの出力ストリームに同時に影響を与えずに、stdoutを強制的にリダイレクトすることはできないと思います。これは、ライブラリを持つために非常に高額な料金のようです。

私はまだ解決策は、独自のプロセスでCコードを「サンドボックス」し、リダイレクトされた出力を必要に応じて読み込むことだと思います。もちろん、Cの機能を印刷する代わりにreturnの結果に書き直す方が良いでしょうが、これはオプションではないと思います。

Cコードでは、明示的なファイルハンドルを持つバリアントであるfprintf()が使用されていると言われているので、おそらくそれを使用して外部からFILE *を受け入れるようにすることができます。それをサブプロセスします。

他の回答を見ることに非常に関心がありますが、おそらく欠けているアプローチがあります。

UPDATE 2:あなたはCライブラリに通過するFILE *を制御する機会を持っている場合、それは簡単です:

  • 出力を持つためにだけでは合格、C++プログラムの通常の出力で表示されますstdout
  • 出力をファイルに取り込むには、ファイルfopen()を入力し、結果としてFILE *を渡します。

の両方を同時に実行する場合は、ももう少し面倒です。その場合は、C++側がCライブラリによって生成された出力を読み込み、それが望むことを行うようにパイプまたはソケットを推奨します。

+0

しかし、Alex ReynoldsはCプログラムではなく、彼のC *ライブラリ*について書いています! –

+0

これは私が後にしていることではありません。私は図書館を書いているので、すべてアプリケーション内で行う必要があります。 –

+0

**パイプとソケットを使ってCプログラムを別々に実行することは、私が行っていることではありません。**私は**ライブラリ**を作成していますので、すべてアプリケーションで行う必要があります。 –

0

私は、C++ std::coutとC stdoutは厄介なやり方で関連しており、<cstdio>を含めることでstdoutをC++で使うことができると述べました。 http://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/manual/manual/io_and_c.html

ただし、ライブラリのAPIを変更し、ユーザーが指定したストリームやユーザーが指定したファイルパスに書き込む関数を提供することを検討することもできます。 Linuxの

私は、少なくとも標準準拠のコードで、いや、正確にあなたの質問を理解している場合、あなたはまたopen_memstreamまたはfopencookie

0

を使用する場合があります。

std :: ios_base :: sync_with_stdioは、いくつかのC++ストリームで作られたIOがCストリームのIO makeと正しく同期することを保証するものです。したがって、stdoutはcoutと同期され、stdinはcinとstderrの幅cerrと同期されます。しかし、それはcoutのstreambufを変更できるようには設計されておらず、stdoutに変更が伝播されています(あなたの要求をどのように理解したか)、stdoutでfreopenを実行すると、

関連する問題