2009-07-21 31 views
27

我正在努力在单元测试下获取一些遗留代码,并且有时感觉现有程序行为的唯一方法是从控制台输出。将cout和stdout重定向到C++中的字符串进行单元测试

我在网上看到了很多关于如何将stdout重定向到C++中的另一个文件的例子,但有没有一种方法可以将它重定向到内存流,因此我的测试不必依靠磁盘?

我想获得遗留代码发送到stdout到std :: string的任何东西,这样我就可以轻松地在输出上查找。

编辑

的遗留代码是如此糟糕,其用户的cout << ..printf混合物。以下是我迄今为止:

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

的问题是,这确实用printf 捕获输出。我想要得到两样东西。有任何想法吗?

+0

下面的答案都不适合我,你有没有一个工作的例子呢? – rraallvv 2016-03-11 19:56:45

回答

14

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

+0

作为stringstream接受你的答案是一个好的指针,你的UPDATE就像我们可能得到的那样,而不会写一些巨大的令人费解的混乱,因为现在我想我只会写一个文件,希望我不需要printf输出许多测试。 – thelsdj 2009-07-22 00:36:59

+3

工作正常,但是如果我使用多个单元测试,则某些失败并出现异常,因为缓冲区已被释放并且stdout被写入该缓冲区。如果仅暂时重定向到缓冲区,则在使用结束时使用`setbuf(stdout,NULL);`。 – Martze 2014-11-14 11:01:48

+0

看到这个答案,以避免“NUL”-Hack在POSIX系统上:http://stackoverflow.com/a/19499003/1557062 – sigy 2016-11-16 15:07:27

2

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

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 

这只是截取的缓冲输出,所以还是到控制台或其它地方。

希望这会有所帮助。

-4

尝试sprintf,这样更有效率。

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