7

funcBから関数を呼び出していますfuncAfuncBいくつかのステートメントを使用してprintfデータを出力します。経由でそのデータをキャプチャする方法はありfuncAますか?変更できませんfuncB

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

funcA(){
    funcB();
}
4

4 に答える 4

14

(この回答は、この回答に基づいて修正されたバージョンです。)

この回答はPOSIX中心です。リダイレクト先のファイルのファイル記述子を作成するために使用openします。次に、 to を使用dup2して、代わりにファイルに書き込むようSTDOUT_FILENOに変更します。stdoutただし、それを行う前に を使いたいdupので、別の でSTDOUT_FILENO復元できます。stdoutdup2

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を使用できます。

于 2012-06-19T22:33:41.997 に答える
2

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

于 2012-06-19T22:28:53.370 に答える
1

介入して汚いゲームをプレイしたい場合は、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バッファのサイズをより賢明に管理するために使用することもできます。

于 2012-06-19T22:34:38.370 に答える
0

funcBのプログラムに入れます。次に、パイプを使用したり、ファイルにリダイレクトしたりして、標準出力をキャプチャできます。それを行う方法は、一般的に OS に依存し、C++ の領域外です。

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

繰り返しますが、それを行う方法は C++ の領域外であり、OS に依存します。

于 2012-06-19T22:22:21.470 に答える