3

作業中のC++プロジェクトでは、GLPK(Gnu Linear Programming Kit で書かれていCます) を使用します。コンソール アプリケーションでいくつかの手順を使用すると、 から自動出力が生成されGLPKます。

すべてをGUIに詰め込んだ後、以前に表示されたテキストを使用したいと思いました。そのため、stdout と stderr をファイルにリダイレクトしました。(そしてprintf("Hallo World");、アプリで正常に動作することを確認しました)。

問題は、テキスト形式がGLPKファイルに表示されないことです。いくつかの調査の後、ステートメントxprintf(...)が使用されていることがわかりました。(正直なところ、私は何が何xprintfをし、何が違うのか見当がつきませんprintf。)

誰か説明してください:

  1. stdout を使用せずにテキストを画面に出力する方法。
  2. 自動生成された出力をファイルやストリーム、または処理できるものに取得するにはどうすればよいですか。
4

4 に答える 4

1
  1. 標準出力なしで画面にテキストを出力する方法。

あなたの平均は、デフォルトで端末に接続されているstdout出力ストリームです。それをファイルに含めて、ストリームで実行できることは何でも実行できます。reopen()

fopen()ファイルに書き込む別のストリームを作成するために使用できるのと同じように、ターミナル ( /dev/ttyLinux の場合) に書き込む別のストリームを作成するためにも使用できます。そのストリームに書き込まれた出力は、stdout を経由しないにもかかわらず、端末に表示されます。

stdout は単なる便利なデフォルトであり、端末にアクセスする唯一の方法ではありません。

于 2012-11-15T09:21:11.567 に答える
1

GLPK によって内部的に使用される (のエイリアス)はxprintf、通常の場合 (最新の GLPK バージョン 4.47 の場合) に書き込みます。glp_printfstdout

の動作を変更するには、いくつかの方法がありますglp_printf

  • を使用して出力を無効にするglp_term_out(GLP_OFF)
  • glp_term_hookフックが必要な場所に出力をリダイレクトできる関数を使用してフックをインストールします
  • glp_open_tee出力のコピーをテキスト ファイルに書き込みます。これは、関数を使用して設定できます。

上記のいずれも使用していないにもかかわらず出力をリダイレクトできないstdout場合は、出力のリダイレクト方法に問題がある可能性があります。

于 2012-11-15T10:32:46.340 に答える
0

stdoutはデフォルトでバッファリングされるため、テキストは新しい行ごとにのみ更新されます。ライブラリの1つまたはxprintf自体がstdoutの動作を変更する可能性があります。基本的に、出力が改行で終わっていない場合、前のprintf()出力が表示される保証はありません。

使用してみてください:

fflush (stdout);

xprintfの後。

fflushはstdio.hにあります

通常、xprintfは非マロッキングprintfです。

于 2012-11-15T09:12:18.623 に答える
0

GLPK では、(で定義)xprintfのマクロ エイリアスです。_glp_lib_xprintfglplib.h

xprintf()に実装されていglplib04.cます。デフォルトでは、 (同じソースファイル内の関数をstdout介して)に出力します。xputc()の動作を変更できるさまざまな設定オプションがありますxputc()

ブレークポイントを設定し_glp_lib_xprintf()、ステップスルーして何が起こっているかを確認したい場合があります。

于 2012-11-15T10:28:10.517 に答える