2009-07-21 78 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);