Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: TiemeОтветов: 4

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

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

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

./programm < in.txt

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

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

c++io-redirectioniostream

Ответы

Ответ 1 · рейтинг 8 · Mike Seymour

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

#include <unistd.h>

if (isatty(STDIN_FILENO)) {
    // not redirected
} else {
    // redirected
}

Ответ 2 · рейтинг 4 · INS

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

isatty(0); // if this is true then you haven't redirected the input

Ответ 3 · рейтинг 2 · celtschk

В стандартном 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;
}

Ответ 4 · рейтинг 1 · datenwolf

В системе 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, часть уязвимой экосистемы, в которой будет жить ваша программа. Не стесняйтесь использовать ее.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы