funcA
から関数funcB
を呼び出しています。 funcB
は、複数のprintf
文を使用してデータを出力します。 funcA
でそのデータをキャプチャする方法はありますか? funcB
は変更できません。printfの出力をキャプチャするには?
funcB(){
printf("%s", "My Name is");
printf("%s", "I like ice cream");
}
funcA(){
funcB();
}
funcA
から関数funcB
を呼び出しています。 funcB
は、複数のprintf
文を使用してデータを出力します。 funcA
でそのデータをキャプチャする方法はありますか? funcB
は変更できません。printfの出力をキャプチャするには?
funcB(){
printf("%s", "My Name is");
printf("%s", "I like ice cream");
}
funcA(){
funcB();
}
この回答はPOSIX中心です。 freopen
を使用してstdout
をファイルにリダイレクトすることができます。しかし、それを行う前にdup
STDOUT_FILENO
にする必要があります。stdout
をfdopen
で元の状態に近い状態に復元することができます。
int stdout_fd = dup(STDOUT_FILENO);
freopen(redirected_filename, "w", stdout);
funcB();
fclose(stdout);
dup2(stdout_fd, STDOUT_FILENO);
stdout = fdopen(STDOUT_FILENO, "w");
close(stdout_fd);
Johnathan Wakely's answerを使用できます。あなたは「盗む」ことができprintf
に介在汚いゲームをプレイするために喜んでいる場合
あなたのルールは、それは働いた! – Gene
funcB
を別のプログラムに入れます。その標準出力をキャプチャすることができます。配管するか、またはファイルにリダイレクトしてください。どのようにするかは、一般にOSに依存し、C++の領域外です。
また、funcA
プロセスの標準出力をファイルにリダイレクトし、FuncB
を呼び出してファイルから出力を取得することもできます。
これもやはりC++の領域外であり、OSによって異なります。
プログラム内に他のものがprintf
を使用していない場合は、独自のバージョンを作成して明示的にリンクすることができます。関数が既に定義されている場合、リンカーは標準ライブラリを調べません。おそらく実装のためにvsprintf
を使うことができます。もしあなたのコンパイラによって提供されていれば、より安全なバージョンとオーバーランチェックがあります。
ような何かやってその出力:あなたはフラグを使用することができ
#include <stdio.h>
#include <stdarg.h>
static char buffer[1024];
static char *next = buffer;
static void funcB(){
printf("%s", "My Name is");
printf("%s", "I like ice cream");
}
static void funcA(){
funcB();
// Do stuff iwth buffer here
fprintf(stderr, "stole: %s\n", buffer);
next=buffer; // reset for later.
}
int main() {
funcA();
}
int printf(const char *fmt, ...) {
va_list argp;
va_start(argp, fmt);
const int ret = vsnprintf(next, sizeof buffer-(next-buffer), fmt, argp);
next += ret;
va_end(argp);
return ret;
}
は、あなたがしたいのインスタンスを処理する方法を示すために、 printfは正常に動作します。 (具体的にはfprintf
にマップするか、dlsym()
/類似のものを使用して実際の呼び出しを見つけます)。
realloc
を使用すると、バッファのサイズをより適切に管理できます。
'funcB'が出力を表示しない代わりに' funcA'に返すのはどうですか?あなたが提供したように抽象的な記述から言うのは難しいが、より具体的である。 – LihO
* "これはC++の質問です" * - 私のCの質問によく似ています。それがC + +の場合、あなたは何かをすることができます:[this](http://stackoverflow.com/a/8076948/168175)。 – Flexo
私の答えで言及されているように、それは私にとってOS特有の質問によく似ています。 –