【问题标题】:How can I know where the stdout directed to in C++ [duplicate]我怎么知道标准输出在 C++ 中指向的位置 [重复]
【发布时间】:2015-09-11 06:15:55
【问题描述】:

我们都知道重定向标准输出有两种方式。

首先,我们可以使用 freopen_s 将 stdout 和 stderr 重定向到一个文件。

其次,我们可以像这样调用可执行文件时重定向stdout和stderr:xxx.exe > log.txt 2>&1。

所以我的问题是我怎么知道 stdout 和 stderr 被重定向到哪里。

在这种情况下,我在程序中遇到了这个问题: 如果用户通过第二种方式重定向标准输出,我应该将其重定向到“CON”,并将一些日志打印到控制台。 如果用户没有重定向它,我不应该将这些日志打印到控制台。

这是因为如果用户没有重定向,这些日志已经打印到控制台了。

【问题讨论】:

  • 这看起来是一个尴尬的要求。我会完全避免它。
  • 这似乎有点落后。如果用户故意重定向你的输出,那么打印到控制台可能不是用户想要的?
  • 一般来说,这是不可能的。此外,这已经被问过了,可能会根据操作系统获得有关输出流的一些信息
  • 操作系统特定的。如果您在 POSIX 上,您正在寻找的关键字是“isatty”。

标签: c++ c redirect


【解决方案1】:

您无法检测到在哪里它被引导,但如果

在 Posix 系统上,使用 isatty():

#include <stdio.h>
#include <io.h>
...    
if (isatty(fileno(stdin)))
    printf( "stdin is a terminal\n" );
else
    printf( "stdin is a file or a pipe\n");

在 Windows 上,使用 _isatty()

【讨论】:

  • isatty 在具有CON.exe 之类的系统上不是很可靠。
  • 在 Windows 中,您可以以一种有点复杂的方式。调用_get_osfhandle(1)HANDLE 发送到标准输出,然后调用GetFinalPathNameByHandle() 找出它指向的位置。
  • @rodrigo Plan 9 中也有可能,但我们只能猜测 OP 的操作系统。
  • @FUZxxl:嗯,我说的是那些带有CON.exe 东西的系统。
  • @rodrigo 程序的文件扩展名为exe 的操作系统不止一种,您可以重定向到CON 的操作系统也不止一种。如果 OP 希望我们提供特定平台的帮助,他应该指定他的平台。
猜你喜欢
  • 1970-01-01
  • 2016-04-26
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
相关资源
最近更新 更多