30

我正在努力在单元测试下获取一些遗留代码,有时感知现有程序行为的唯一方法是从控制台输出。

我在网上看到很多关于如何将标准输出重定向到 C++ 中的另一个文件的示例,但是有没有办法可以将它重定向到内存中的流,这样我的测试就不必依赖磁盘了?

我想将遗留代码发送到 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);

请注意,对于 linux,您应该使用“/dev/null”而不是“NUL”。这将迅速开始填满 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 回答