既重定向cout和标准输出在C字符串++单元测试(Redirect both cout and st

2019-06-26 12:04发布

我努力让下单元测试一些遗留代码,有时只有这样才能感觉到现有程序的行为是从控制台输出。

我看到很多的例子在线为如何将stdout在C ++另一个文件,但有什么办法,我可以把它重定向到一个内存流,所以我的测试中不必依赖在磁盘上?

我想获得任何遗留代码发送到标准输出到一个std ::字符串,所以我可以很容易地.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捕捉输出。 我想的东西得到两者。 有任何想法吗?

Answer 1:

std::stringstream可能是你在找什么。

UPDATE
好吧,这是一个有点劈,但也许你可以做到这一点抓住的printf输出:

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

请注意,您应该使用“的/ dev / null的”为Linux而不是“NUL”。 这将迅速启动填补huge_string_buffer。 如果你希望能够继续重定向输出后的缓冲区满你必须调用fflush(),否则会抛出异常。 见std::setbuf获取更多信息。



Answer 2:

您可以使用freopen(..., stdout) ,然后转储文件到内存或者一个std::string



Answer 3:

这可以是一种替代方案:

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

这只是拦截缓冲输出,所以还是到控制台或任何地方。

希望这可以帮助。



Answer 4:

尝试sprintf的,这是更有效的。

int i;
char str[] = "asdf";
char output[256];
sprintf(output, "asdfasdf %s %d\n", str, i);


文章来源: Redirect both cout and stdout to a string in C++ for Unit Testing