2015-09-11 3 views
1

Мы все знаем, что есть два способа перенаправления стандартного вывода.Как узнать, где находится stdout в C++

Во-первых, мы можем использовать freopen_s для перенаправления stdout и stderr в файл.

Во-вторых, мы можем перенаправить стандартный вывод и стандартный поток ошибок, когда мы называем исполняемый файл, как это: xxx.exe> ​​log.txt 2> & 1.

Так что моя проблема заключается в том, как я могу знать, где стандартный вывод и stderr перенаправлен.

Я встретил эту проблему в своей программе в такой ситуации: Если пользователь перенаправил стандартный вывод вторым способом, я должен перенаправить его на «CON» и напечатать несколько журналов на консоли. Если пользователь не перенаправил его, я не должен печатать эти журналы на консоли.

Это связано с тем, что если пользователь не перенаправил его, эти журналы уже были напечатаны на консоли.

+0

Это выглядит как неудобное требование. Я бы вообще этого не избежал. – Amit

+1

Это кажется немного отсталым. Если пользователь перенаправляет ваш вывод специально, печать на консоль в любом случае, вероятно, не та, что пользователь хочет? – melak47

+0

В общем, это невозможно. Кроме того, это уже было задано, возможно, есть возможность получить НЕУСТОЙНУЮ информацию о вашем потоке вывода, в зависимости от операционной системы –

ответ

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().

+1

'isatty' не очень надежна в системах с' CON' и '.exe' и т. Д. –

+2

В Windows вы можете, несколько запутанно. Вызовите '_get_osfhandle (1)', чтобы получить 'HANDLE' в stdout, а затем' GetFinalPathNameByHandle() ', чтобы узнать, где он указывает. – rodrigo

+0

@rodrigo В Plan 9 тоже возможно, но мы можем только догадываться о операционной системе OP. – fuz

Смежные вопросы