簡體   English   中英

如何快速擺脫std :: cout

[英]How to get rid of std::cout quickly

我繼承了一個很大的代碼庫,其中std::cout經常用於打印調試信息。 代碼中沒有真正的調試/日志功能,由於這是一個短暫的任務(錯誤修正),因此現在實現調試/日志功能是不可能的。

這確實使我感到困擾,該程序輸出的文本數量很大,至少在我不得不對其進行處理之前,我想暫時禁用所有打印輸出。

我現在看到兩種解決方案:

  1. 只是將它們注釋掉...這是很多工作,因為一些std::couts跨越多行,所以我必須手動找到它們
  2. 用具有自己的operator <<的構造替換std::cout所有出現,然后簡單地吞下所有輸出

您對此問題有更好的解決方案嗎?

您可以使用以下方式以編程方式重定向標准輸出

FILE origSTDOUT = *stdout;
static FILE* nul = fopen( "NUL", "w" );
*stdout = *nul;
setvbuf( stdout, NULL, _IONBF, 0 );

從您想抑制輸出並使用諸如

*stdout = origSTDOUT;

恢復它。

從應用程序內部

如果要從應用程序內部執行此操作,則可以更改std::cout的基礎std::streambuf ,以便任何輸出有效地終止於其他位置。


std::ostringstream buffer;
std::streambuf * cout_streambuf = std::cout.rdbuf (buffer.rdbuf ()); // (A)

std::cout << "hello world\n";                                        // (B) 

std::cout.rdbuf (orig_cout_streambuf);                               // (C)
  • (A)會將std::cout的基礎streambuf設置為buffer ,並返回舊的streambuf (使用該值有效地初始化cout_streambuf )。
  • (B)寫一些數據,有效地使其最終存儲在我們的std::ostreamstream
  • (C)重置底層的streambuf ,恢復到之前的狀態


注意(B)代表應用程序中您希望具有“重定向的std :: cout”的部分



使用shell重定向

不用搞亂應用程序本身,您可以使用外殼程序提供的功能,只需將輸出到STDOUT的重定向到/dev/null或等效文件(有效地將其丟棄)


* NIX

./binary > /dev/null # send STDOUT to /dev/null


視窗

./binary > NUL       # send STDOUT to NUL

這個:

std::cout.rdbuf(nulllptr);

禁用任何輸出。 只需將其添加到main。

您可以將標准輸出重定向到空文件。 因此,輸出變得不可見。 在Unix系統中,您可以像在控制台上那樣運行程序: program_name > /dev/null 對於Windows,您可以嘗試program_name > nul

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM