【问题标题】:Is there a way to determine whether stdout is pointing to the console?有没有办法确定标准输出是否指向控制台?
【发布时间】:2014-05-23 05:12:50
【问题描述】:

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

我不确定 Windows API 函数 GetStdHandle 是否有任何帮助,或者它是否只是一种指向标准输出但无法确定任何相关信息的方法。同样,我不确定我们是否可以从 cout 获得任何信息来表明它是指向控制台还是其他东西。到目前为止,我还没有找到任何类似的东西。

【问题讨论】:

标签: c++ windows winapi


【解决方案1】:

在您想了解的句柄上致电GetConsoleMode (http://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;

【讨论】:

  • WriteConsole 也失败了,因为它在控制台上“绘画”。 msdn.microsoft.com/en-us/library/windows/desktop/…
  • 比较真/假对我来说是一种代码味道——我宁愿做redirected = !success
  • 我怀疑我是否会将“== FALSE”视为代码异味——还有什么更深层次的问题可以表明“!成功”不是?我遇到过一些根本不喜欢“!”的人。在比较中。所以,在最好的情况下,这只是一种宗教性的东西,我放在那里的东西不会有人不喜欢它。
  • 如果是控制台并且输出使用 > 重定向则不起作用
【解决方案2】:

GetFileType 函数允许您区分字符模式设备(例如控制台)和文件和管道。

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2020-05-29
    • 2014-03-03
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    相关资源
    最近更新 更多