Возможный дубликат:
Определить, является ли stdin терминалом или конвейером в C / C ++ / Qt?
Представьте, что у нас есть небольшая программа, которая принимает стандартный ввод C.
Я хотел бы знать, использует ли пользователь перенаправление ввода, например, так:
./programm < in.txt
Есть ли способ обнаружить этот способ перенаправления ввода в программе?
Ответ 1 · рейтинг 8 · Mike Seymour
Для этого нет переносимого способа, поскольку C ++ ничего не говорит о том, откуда берется cin. В системе Posix вы можете проверить, исходит ли cin с терминала или перенаправляется, используя _ 3_, примерно так:
#include <unistd.h>
if (isatty(STDIN_FILENO)) {
// not redirected
} else {
// redirected
}
Ответ 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, часть уязвимой экосистемы, в которой будет жить ваша программа. Не стесняйтесь использовать ее.