有没有办法确定stdout是否指向控制台?

问题描述:

我想将代码插入在Windows上运行的C++应用程序,以确定stdout(或cout)是否指向控制台,如果是,则在将它们写出之前将字符转换为终端编码。如果没有(例如,如果写入文件或管道),字符应单独保留。转换部分不是问题,但我想知道应用程序是否有可能知道它的标准输出是否转到控制台或其他地方。有没有办法确定stdout是否指向控制台?

我不确定Windows API函数GetStdHandle是否有任何帮助,或者它只是指向stdout而不能确定任何信息的方法。同样,我不确定是否有任何可以从cout获得的信息表明它是否指向控制台或其他内容。到目前为止,我还没有能够找到任何这方面的内容。

+0

不是我所知道的 –

致电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”视为一种代码异味 - 更深层次的问题可能表明这种“!成功”不会是什么? 我遇到过一些根本不喜欢'!'的人在比较中。所以,最好的情况是,这只是一种宗教信仰,而且我不会放弃那些我不会喜欢的东西。 –

GetFileType的功能可以字符模式设备(如控制台)和文件和管道之间进行区分。