近期一個Win32窗口項目中,調試時經常需要輸出調試信息以追蹤數據流及程序運行狀態。
起初我封裝了一系列文件操作,實現了日志形式的調試信息輸出,但在后期的使用過程中越發覺得頗不順手。那么,如何方便地在Win32程序中使用控制台進行調試輸出?答案如題:AllocConsole函數和C-Runtime的freopen函數。具體操作流程如下:
- 打開控制台
- 重定向輸出流至控制台
- 執行調試信息輸出操作
完整代碼如下:
AllocConsole(); freopen("CONOUT$", "w", stdout); std::cout << "This is a test info" << std::endl;
相關函數說明:
AllocConsole函數的功能是為當前的窗口程序申請一個Console窗口,其原型為
BOOL AllocConsole(void);
函數調用成功,返回非零值,調用不成功則返回0。
freopen函數用來替換一個流,或者說重新分配文件指針,以實現重定向。可重定向的流有:標准輸入流、標准輸出流或者標准錯誤流。其函數原型為
FILE *freopen(const char *path, const char *mode, FILE *stream);
其中"CONOUT$"是指代當前console的特殊字符串,"w"表明以written模式打開這個console,stdout指代標准輸出流。
補充:
AllocConsole函數不能改變控制台窗口在屏幕上的位置、尺寸等屬性。以下函數可以控制&獲取控制台相關信息。
GetConsoleScreenBufferInfo // 檢索窗口大小,屏幕緩沖區大小及顏色屬性
SetConsoleWindowInfo // 改變控制台窗口大小
SetConsoleScreenBufferSize // 改變控制台屏幕緩沖區大小
SetConsoleTextAttribute // 設置顏色屬性
SetConsoleTitle // 設置控制台窗口標題
GetConsoleTitle // 獲取控制台窗口標題