n.d*_*bau 7 c stdin instruments
我在Mac OSX上编写了一个小型C程序,它执行以下步骤:
在步骤1和2之间,我想提示用户并等待某种键盘输入以发出"继续进行到步骤2"的信号.问题是当使用命令调用程序时,stdin已被重定向:
$ ./simple < input.in
Run Code Online (Sandbox Code Playgroud)
我想在读取文件后将stdin重定向到键盘,我不知道该怎么做.我试过用
fclose(stdin);
freopen("newin", "r", stdin);
Run Code Online (Sandbox Code Playgroud)
但是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 = %s\n", c);
// if (strcmp(c, cmp))
// break;
sleep(1);
}
// STEP 2
// do something here
return 0;
}
Run Code Online (Sandbox Code Playgroud)
newin除非您有一个想要使用的文件,否则您的freopen调用将会失败。(此外,您不能在调用之前关闭流freopen,因为freopen需要一个有效的流,它会作为副作用而关闭该流。)要重新打开标准输入以从终端读取,您需要指定/dev/tty为文件名:
if (!freopen("/dev/tty", "r", stdin)) {
perror("/dev/tty");
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
如果程序在您的控制之下,则无需重新打开stdin- 只需/dev/tty作为单独的文件指针打开,并使用它来获取交互式输入:
FILE *tty = fopen("/dev/tty", "r");
if (!tty) {
perror("/dev/tty");
exit(1);
}
...
while (1) {
fgets(c, sizeof(c), tty);
...
}
Run Code Online (Sandbox Code Playgroud)
无论哪种情况,都无法使用 shell 管道自动执行交互式响应,但这似乎正是您想要的。读取/dev/tty是支持输入重定向和交互式工作的命令行程序(例如某些 Unix 编辑器)的标准做法。