funcB
から関数を呼び出していますfuncA
。
funcB
いくつかのステートメントを使用してprintf
データを出力します。経由でそのデータをキャプチャする方法はありfuncA
ますか?変更できませんfuncB
。
funcB(){
printf( "%s", "My Name is" );
printf( "%s", "I like ice cream" );
}
funcA(){
funcB();
}
(この回答は、この回答に基づいて修正されたバージョンです。)
この回答はPOSIX中心です。リダイレクト先のファイルのファイル記述子を作成するために使用open
します。次に、 to を使用dup2
して、代わりにファイルに書き込むようSTDOUT_FILENO
に変更します。stdout
ただし、それを行う前に を使いたいdup
ので、別の でSTDOUT_FILENO
復元できます。stdout
dup2
fflush(stdout);
int stdout_fd = dup(STDOUT_FILENO);
int redir_fd = open(redirected_filename, O_WRONLY);
dup2(redir_fd, STDOUT_FILENO);
close(redir_fd);
funcB();
fflush(stdout);
dup2(stdout_fd, STDOUT_FILENO);
close(stdout_fd);
が を使用している場合funcB
は、代わりに をstd::cout
使用します。std::cout.flush()
fflush(stdout)
C++ ストリームをより直接的に操作したい場合は、Johnathan Wakely の answerを使用できます。
プログラムで他に を使用していない場合はprintf
、独自のバージョンを作成して明示的にリンクできます。関数が既に定義されている場合、リンカーは標準ライブラリを検索しません。おそらくvsprintf
実装に使用するか、コンパイラによって提供されている場合はオーバーランチェックを備えたより安全なバージョンを使用できます。
介入して汚いゲームをプレイしたい場合は、printf
次のような方法でその出力を「盗む」ことができます。
#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 を通常どおり動作させたいインスタンスの処理方法を示すことができます。(たとえば、実際の呼び出しを見つけるには、/similar にマップするfprintf
か、/similar を使用します)。dlsym()
realloc
バッファのサイズをより賢明に管理するために使用することもできます。
別funcB
のプログラムに入れます。次に、パイプを使用したり、ファイルにリダイレクトしたりして、標準出力をキャプチャできます。それを行う方法は、一般的に OS に依存し、C++ の領域外です。
または、プロセスの標準出力をファイルにリダイレクトしてfuncA
から、 を呼び出してFuncB
、ファイルから出力を取得することもできます。
繰り返しますが、それを行う方法は C++ の領域外であり、OS に依存します。