2012-06-19 15 views
7

funcAから関数funcBを呼び出しています。 funcBは、複数のprintf文を使用してデータを出力します。 funcAでそのデータをキャプチャする方法はありますか? funcBは変更できません。printfの出力をキャプチャするには?

funcB(){ 
    printf("%s", "My Name is"); 
    printf("%s", "I like ice cream"); 
} 

funcA(){ 
    funcB(); 
} 
+2

'funcB'が出力を表示しない代わりに' funcA'に返すのはどうですか?あなたが提供したように抽象的な記述から言うのは難しいが、より具体的である。 – LihO

+2

* "これはC++の質問です" * - 私のCの質問によく似ています。それがC + +の場合、あなたは何かをすることができます:[this](http://stackoverflow.com/a/8076948/168175)。 – Flexo

+0

私の答えで言及されているように、それは私にとってOS特有の質問によく似ています。 –

答えて

10

この回答はPOSIX中心です。 freopenを使用してstdoutをファイルにリダイレクトすることができます。しかし、それを行う前にdupSTDOUT_FILENOにする必要があります。stdoutfdopenで元の状態に近い状態に復元することができます。

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に介在汚いゲームをプレイするために喜んでいる場合

+0

あなたのルールは、それは働いた! – Gene

0

funcBを別のプログラムに入れます。その標準出力をキャプチャすることができます。配管するか、またはファイルにリダイレクトしてください。どのようにするかは、一般にOSに依存し、C++の領域外です。

また、funcAプロセスの標準出力をファイルにリダイレクトし、FuncBを呼び出してファイルから出力を取得することもできます。

これもやはりC++の領域外であり、OSによって異なります。

1

プログラム内に他のものがprintfを使用していない場合は、独自のバージョンを作成して明示的にリンクすることができます。関数が既に定義されている場合、リンカーは標準ライブラリを調べません。おそらく実装のためにvsprintfを使うことができます。もしあなたのコンパイラによって提供されていれば、より安全なバージョンとオーバーランチェックがあります。

1

ような何かやってその出力:あなたはフラグを使用することができ

#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を使用すると、バッファのサイズをより適切に管理できます。

関連する問題