2008-10-01 105 views
2

再次,我的老師無法回答我的問題。我知道誰可能是能夠...setbuf()是否會影響cout?

所以,我從來沒有真正學會C.在C++中,我會很明顯,使用COUT聲明所有的時間。在最近的一次任務,我的老師告訴我們,以確保把

setbuf(stdout , NULL); 

在頂部的main(),以獲得無緩衝輸出,從而使我們能夠正確地看到輸出。

我的問題是這樣的:將本聲明影響的cout語句,或者乾脆一個printf()語句,我打電話?

在此先感謝!

回答

6

默認情況下,輸入輸出流和標準輸入輸出是同步的。 Reference.

這並不意味着手動調節標準輸入輸出緩衝是一個好主意,但!你可能希望利用std::endlstd::flush(來自<ostream>),這可能會對你有所幫助。例如,

std::cout << "Hello, world!" << std::endl; 

std::cout << "Hello, world!\n" << std::flush; 

這兩個做同樣的事情。 (std::endl =打印底線,然後沖洗。)

5

默認情況下,如果標準輸出或COUT被打印到控制檯時,輸出行緩衝。這意味着每一個打印的換行都會刷新輸出。你可以顯式調用flush(),只要你想重寫行爲,以防萬一,輸出將被重定向到一個文件,並且你想使用tail -f並且需要實時輸出某些輸出。

正如克里斯說,sync_with_stdio應配合無緩衝標準輸出與緩衝COUT(默認),但如果你正在做的是使用COUT,而不是用在標準輸出函數setbuf,更好的選擇是對指針使用pubsetbufrdbuf返回。即:

// make cout unbuffered 
std::cout.rdbuf()->pubsetbuf(0, 0); 

另一個可能有趣的功能是看tie

1

通常,當立即看到輸出很重要時,我們討論的是複雜,高度可靠的金融例程,它必須將事務記錄到硬盤中,然後才能將其發送給對方。或者,(更常見的情況下)我們希望即使在程序崩潰時也能看到調試消息。

既然你學習,我假設你正在處理的第二種情況。在這種情況下,我的建議是使用stderr而不是stdout。默認情況下它是無緩衝的,您可以將其與stdout分開重新定向,將輸出放在一個地方,並將您的輸出放入另一個地方。

相關問題