C++ 如何知道标准输出在C++;
我们都知道有两种方法可以重定向标准输出 首先,我们可以使用freopens将stdout和stderr重定向到一个文件 其次,我们可以在调用可执行文件时重定向stdout和stderr,如下所示:xxx.exe>log.txt 2>&1 所以我的问题是,我如何知道stdout和stderr被重定向到了哪里 在这种情况下,我在我的程序中遇到了这个问题: 如果用户通过第二种方式重定向standart输出,我应该将其重定向到“CON”,并将一些日志打印到控制台。 如果用户没有重定向它,我就不应该将这些日志打印到控制台 这是因为如果用户没有重定向它,这些日志已经打印到控制台。您无法检测到它被重定向到哪里,但是如果 在Posix系统上,使用:C++ 如何知道标准输出在C++;,c++,c,redirect,C++,C,Redirect,我们都知道有两种方法可以重定向标准输出 首先,我们可以使用freopens将stdout和stderr重定向到一个文件 其次,我们可以在调用可执行文件时重定向stdout和stderr,如下所示:xxx.exe>log.txt 2>&1 所以我的问题是,我如何知道stdout和stderr被重定向到了哪里 在这种情况下,我在我的程序中遇到了这个问题: 如果用户通过第二种方式重定向standart输出,我应该将其重定向到“CON”,并将一些日志打印到控制台。 如果用户没有重定向它,我就不应该将这些
#包括
#包括
...
if(isatty(fileno(stdin)))
printf(“stdin是一个终端\n”);
其他的
printf(“stdin是一个文件或管道\n”);
在Windows上,使用.这似乎是一个很尴尬的要求。我会完全避免。这似乎有点落后。如果用户有意重定向您的输出,那么无论如何打印到控制台可能不是用户想要的?一般来说,这是不可能的。此外,已经有人问过这个问题,根据操作系统的具体情况,可能有可能获得有关输出流的一些信息。如果您在POSIX上,您要查找的关键字是“
isatty
”。isatty
在具有CON
和.exe
等功能的系统上不太可靠。在Windows中,您可以以某种复杂的方式进行操作。调用\u get\u osfhandle(1)
将句柄
转到stdout,然后GetFinalPathNameByHandle()
找出它的指向。@rodrigo在计划9中也有可能,但我们只能猜测OPs操作系统。@fuzzxl:,我说的是那些带有CON
和.exe
的系统。@rodrigo有不止一个操作系统,其中程序的文件扩展名是exe
,还有不止一个操作系统可以重定向到CON
。如果OP希望我们提供平台特定的帮助,他应该指定他的平台。
#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");