Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何知道标准输出在C++;_C++_C_Redirect - Fatal编程技术网

C++ 如何知道标准输出在C++;

C++ 如何知道标准输出在C++;,c++,c,redirect,C++,C,Redirect,我们都知道有两种方法可以重定向标准输出 首先,我们可以使用freopens将stdout和stderr重定向到一个文件 其次,我们可以在调用可执行文件时重定向stdout和stderr,如下所示:xxx.exe>log.txt 2>&1 所以我的问题是,我如何知道stdout和stderr被重定向到了哪里 在这种情况下,我在我的程序中遇到了这个问题: 如果用户通过第二种方式重定向standart输出,我应该将其重定向到“CON”,并将一些日志打印到控制台。 如果用户没有重定向它,我就不应该将这些

我们都知道有两种方法可以重定向标准输出

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

其次,我们可以在调用可执行文件时重定向stdout和stderr,如下所示:xxx.exe>log.txt 2>&1

所以我的问题是,我如何知道stdout和stderr被重定向到了哪里

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

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

您无法检测到它被重定向到哪里,但是如果

在Posix系统上,使用:

#包括
#包括
...    
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");