Когда вы делаете cat file_name | ./a.out
, стандартный ввод вашей программы привязывается к каналу, связывающему его с выводом cat
. Ваша программа никогда не увидит пользовательский ввод - тот самый поток, откуда он прибыл, был заменен вышеупомянутым каналом.
Имейте в виду, я подозреваю, что с какой-то ужасной хитростью, специфичной для POSIX, вы сможете снова открыть ее, перейдя прямо к устройству tty, но это просто плохой дизайн. Если вам нужно как прочитать из файла , так и принять интерактивный ввод пользователя, просто примите файл в качестве аргумента командной строки и используйте stdin для взаимодействия с пользователем.
Редактировать
Это пример специфичных для Unix кладжей, которые можно попробовать, предполагая, что у процесса все еще есть управляющий терминал. После прочтения всего исходного stdin я открываю /dev/tty
(который является управляющим терминалом процесса) и повторно связываю stdin
с ним.
Отказ от ответственности : это только для развлекательных целей, не делайте этого по-настоящему .
#include <stdio.h>
#include <stdlib.h>
void die(const char *msg) {
fprintf(stderr, "%s\n", msg);
fputs(msg, stderr);
exit(1);
}
int main() {
/* Read all of stdin and count the bytes read (just to do something with it) */
int ch;
unsigned long count = 0;
while((ch = getchar())!=EOF) {
count++;
}
printf("Read %lu bytes from stdin\n", count);
/* Open the controlling terminal and re-link it to the relevant C library FILE *
* Notice that the UNIX fd for stdin is still the old one (it's
* surprisingly complex to "reset" stdio stdin to a new UNIX fd) */
if(freopen("/dev/tty", "r", stdin) == NULL) {
die("Failed freopen");
}
/* Do something with this newly gained console */
puts("How old are you?");
fflush(stdout);
int age = -1;
if(scanf("%d", &age)!=1) {
die("Bad input");
}
printf("You are %d years old\n", age);
return 0;
}
(ранее у меня было решение, которое проверяло, были ли stderr
или stdout
по-прежнему консолями, что было еще большим плюсом; спасибо @ rici за напоминание мне о том, что POSIX имеет понятие «управляющий терминал», доступное через /dev/tty
)