2011-12-12 134 views
5

我正在使用一個共享庫,其函數在各處都執行std :: cout。是否可以在呼叫者級別做任何事情,我可以壓制cout outout或將其重定向到某個位置?在函數中抑制cout輸出

它甚至有可能在C++中嘗試這樣的事情。

+2

我想你可以在每次調用共享庫之前和之後調用stdout(stdout)。根據您的要求,性能和線程可能是一個問題。 – Joe

+1

例如,您可以使用'std :: cout.rdbuf()'將輸出重定向到一個文件。 – lapk

+0

此外,這個共享庫似乎並不像商業質量。如果你有這個庫的源代碼,你應該重新編譯它禁用日誌記錄。一個負責任的圖書館將允許使用預處理器定義在一個地方發生這種情況。 – Joe

回答

4

就像這樣,只需爲您的庫調用創建函數包裝,即可重定向cout

int main(void) 
{ 
std::ofstream lStream("garbage.txt"); 
std::streambuf* lBufferOld = std::cout.rdbuf(); 

std::cout.rdbuf(lStream.rdbuf()); 
std::cout << "Calling library function" << std::endl; 

std::cout.rdbuf(lBufferOld); 
std::cout << "Normal output" << std::endl; 

std::cout.rdbuf(lStream.rdbuf()); 
std::cout << "Calling another library function" << std::endl; 

std::cout.rdbuf(lBufferOld); 
std::cout << "Another normal output" << std::endl; 

lStream.close(); 

return (0); 
} 
+1

使用rdbuf和freeopen有什麼不同?哪一個會是更好的方法? – Jithin

+0

@Jithin我的理解是'cout'需要在每個庫函數調用之前重定向,而不僅僅是一次。在這種情況下,'rdbuf()'是最快的,我認爲, - 它只是在打開一次文件後設置一個指針。如果'cout'只需要重定向一次,那麼兩種方法('rdbuf'或'freopen')基本相同。 – lapk

0

您可以通過創建類來處理輸出來始終過濾所有I/O。鑑於該類可能在應用程序範圍內使用,靜態類可能是有序的,但您可以根據需要實例化該類的一個實例。

除了根據參數字符串來寫或不寫輸出或甚至選擇不同的輸出外,類還可以根據所選輸出的類型對文本進行格式設置。

我看着ostream,副手沒有看到任何可以直接修改cout的方法。你遇到過以前需要的東西,所以希望其他人閱讀這篇文章可能對創建我建議的課程有更好的想法。