C将stdin重定向到键盘
我在Mac OSX上编写了一个小巧的C程序,它执行以下步骤:
在步骤1和步骤2之间,我想提示用户并等待某种键盘输入以发出“继续执行步骤2”的信号。 问题在于使用以下命令调用程序时stdin已被重定向:
$ ./simple < input.in
我想在读取文件后将stdin重定向到键盘,我不知道如何执行此操作。 我尝试过使用
fclose(stdin);
freopen("newin", "r", stdin);
但stdin无法从键盘上读取。 任何建议如何做到这一点将不胜感激。
还有一些观点:
int main(void) {
// STEP 1
int array[ARRLEN];
readinput(array, ARRLEN);
// WAIT FOR KEYBOARD INPUT TO PROCEDE
// redefine stdin to keyboard
fclose(stdin);
freopen("newin", "r", stdin);
char c[5];
char cmp[5] = ".";
puts ("Enter text. Include a dot ('.') in a sentence to exit:");
while (1) {
fgets(c, sizeof(c), stdin);
printf("c = %sn", c);
// if (strcmp(c, cmp))
// break;
sleep(1);
}
// STEP 2
// do something here
return 0;
}
除非你有一个你想使用的名为newin
的文件,否则你的freopen
调用将失败。 (另外,在调用freopen
之前,您不能关闭流,因为freopen
需要一个有效的流,它会以副作用的方式关闭。)要重新打开标准输入以从终端读取,您需要指定/dev/tty
作为文件名称:
if (!freopen("/dev/tty", "r", stdin)) {
perror("/dev/tty");
exit(1);
}
如果程序在你的控制之下,没有理由重新打开stdin
,只需打开/dev/tty
作为单独的文件指针,然后使用它获取交互式输入:
FILE *tty = fopen("/dev/tty", "r");
if (!tty) {
perror("/dev/tty");
exit(1);
}
...
while (1) {
fgets(c, sizeof(c), tty);
...
}
无论哪种情况,都不可能使用shell管道自动执行交互式响应,但似乎是您想要的。 从/dev/tty
读取是支持输入重定向和交互式工作的命令行程序的标准做法,例如某些Unix编辑器。