30

私は単体テストでいくつかのレガシーコードを取得することに取り組んでおり、既存のプログラムの動作を感知する唯一の方法はコンソール出力からです。

C++ で stdout を別のファイルにリダイレクトする方法についてオンラインで多くの例を目にしますが、テストがディスクに依存する必要がないようにメモリ内ストリームにリダイレクトする方法はありますか?

レガシ コードが stdout に送信するものをすべて std::string に取得して、出力で簡単に .find できるようにしたいと考えています。

編集

レガシ コードは非常に悪いため、 と が混在していcout << ..ますprintf。これが私がこれまでに持っているものです:

void TestSuite::setUp(void)
{
    oldStdoutBuf = std::cout.rdbuf();
    std::cout.rdbuf(consoleOutput.rdbuf());
}
void TestSuite::tearDown(void)
{
    std::cout.rdbuf(oldStdoutBuf);
}

問題は、これがprintf を使用して出力をキャプチャしないことです。両方を兼ね備えたものが欲しい。何か案は?

4

4 に答える 4

15

std::stringstreamあなたが探しているものかもしれません。

更新
さて、これはちょっとしたハックですが、これを実行して printf 出力を取得できます。

char huge_string_buf[MASSIVE_SIZE];
freopen("NUL", "a", stdout);
setbuf(stdout, huge_string_buffer);

「NUL」の代わりに Linux の「/dev/null」を使用する必要があることに注意してください。これにより、すぐに huge_string_buffer がいっぱいになり始めます。バッファがいっぱいになった後も出力をリダイレクトし続けたい場合は、fflush() を呼び出す必要があります。そうしないと、エラーがスローされます。詳細については、を参照std::setbufしてください。

于 2009-07-21T22:26:12.330 に答える
3

を使用freopen(..., stdout)して、ファイルをメモリまたはstd::string.

于 2009-07-21T22:31:23.817 に答える
2

これは別の方法かもしれません:

char bigOutBuf[8192];
char savBuf[8192];

fflush(stdout);
setvbuf(stdout,bigOutBuf,IOFBF,8192);//stdout uses your buffer

//after each operation
strncpy(savBuf,bigOutBuf,8192);//won't flush until full or fflush called

//...

//at long last finished
setbuf(stdout,NULL);//reset to unnamed buffer

これはバッファリングされた出力を傍受するだけなので、コンソールまたはどこにでも行きます。

お役に立てれば。

于 2009-09-18T19:17:05.530 に答える
-4

sprintfを試してみてください。より効率的です。

int i;
char str[] = "asdf";
char output[256];
sprintf(output, "asdfasdf %s %d\n", str, i);
于 2013-03-20T04:10:11.740 に答える