C ++ Обнаружение перенаправления ввода

Возможный дубликат:
Определить, является ли stdin терминалом или конвейером в C / C ++ / Qt?

Представьте, что у нас есть небольшая программа, которая принимает стандартный ввод C.

Я хотел бы знать, использует ли пользователь перенаправление ввода, например, так:

./programm < in.txt

Есть ли способ обнаружить этот способ перенаправления ввода в программе?


person Tieme    schedule 10.11.2011    source источник
comment
Может быть, это поможет: stackoverflow.com/questions/2216529/   -  person darnir    schedule 10.11.2011
comment
Связано: stackoverflow.com/questions/2027484/   -  person IronMensan    schedule 10.11.2011
comment
Зачем тебе это нужно знать. Все дело в том, чтобы ввод выглядел одинаково.   -  person Martin York    schedule 10.11.2011
comment
@LokiAstari: вы можете запрашивать у пользователя ввод данных при чтении с терминала, а не иначе.   -  person Mike Seymour    schedule 10.11.2011


Ответы (4)


Для этого нет переносимого способа, поскольку C ++ ничего не говорит о том, откуда берется cin. В системе Posix вы можете проверить, исходит ли cin с терминала или перенаправляется, используя _ 3_, примерно так:

#include <unistd.h>

if (isatty(STDIN_FILENO)) {
    // not redirected
} else {
    // redirected
}
person Mike Seymour    schedule 10.11.2011

В системе posix вы можете использовать функцию isatty. Стандартный ввод - это дескриптор файла 0.

isatty(0); // if this is true then you haven't redirected the input
person INS    schedule 10.11.2011
comment
Но вместо 0 можно было бы сказать fileno(std::stdin) :-) - person Kerrek SB; 10.11.2011
comment
@KerrekSB: Или STDIN_FILENO, если вам не нужен ненужный вызов функции. - person Mike Seymour; 10.11.2011

В стандартном C ++ это невозможно. Однако в системах Posix вы можете использовать isatty:

#include <unistd.h>
#include <iostream>

int const fd_stdin = 0;
int const fd_stdout = 1;
int const fd_stderr = 2;

int main()
{
  if (isatty(fd_stdin)) 
    std::cout << "Standard input was not redirected\n";
  else
    std::cout << "Standard input was redirected\n";
  return 0;
}
person celtschk    schedule 10.11.2011

В системе POSIX вы можете проверить, является ли stdin, т.е. fd 0, TTY:

#include <unistd.h>

is_redirected() {
    return !isatty(0) || !isatty(1) || !isatty(2);
}

is_input_redirected() {
    return !isatty(0);
}

is_output_redirected() {
    return !isatty(1) || !isatty(2);
}

is_stdout_redirected() {
    return !isatty(1);
}

is_stderr_redirected() {
    return !isatty(2);
}

Это не часть стандартной библиотеки C ++, но, если она работает в системе POSIX, часть уязвимой экосистемы, в которой будет жить ваша программа. Не стесняйтесь использовать ее.

person datenwolf    schedule 10.11.2011