2014-04-09 136 views
2

我想將代碼插入在Windows上運行的C++應用程序,以確定stdout(或cout)是否指向控制檯,如果是,則在將它們寫出之前將字符轉換爲終端編碼。如果沒有(例如,如果寫入文件或管道),字符應單獨保留。轉換部分不是問題,但我想知道應用程序是否有可能知道它的標準輸出是否轉到控制檯或其他地方。有沒有辦法確定stdout是否指向控制檯?

我不確定Windows API函數GetStdHandle是否有任何幫助,或者它只是指向stdout而不能確定任何信息的方法。同樣,我不確定是否有任何可以從cout獲得的信息表明它是否指向控制檯或其他內容。到目前爲止,我還沒有能夠找到任何這方面的內容。

+0

不是我所知道的 –

回答

4

致電GetConsoleModehttp://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx)您想了解的手柄上。如果它被重定向到另一個控制檯句柄之外(例如對一個文件),那麼GetConsoleMode將會失敗。例如:

DWORD temp; 
const BOOL success = GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &temp); 
const bool redirected = success == FALSE; 
+0

'WriteConsole'也失敗了,因爲它在控制檯上「繪畫」。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms687401%28v=vs.85%29.aspx –

+0

比較真/假是我的代碼味道 - 我寧願做'重定向=!成功「。 –

+0

我懷疑我會將「== FALSE」視爲一種代碼異味 - 更深層次的問題可能表明這種「!成功」不會是什麼? 我遇到過一些根本不喜歡'!'的人在比較中。所以,最好的情況是,這只是一種宗教信仰,而且我不會放棄那些我不會喜歡的東西。 –

1

GetFileType的功能可以字符模式設備(如控制檯)和文件和管道之間進行區分。

相關問題