C将标准输入重定向到键盘 [英] C redirect stdin to keyboard
本文介绍了C将标准输入重定向到键盘的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在Mac OSX上编写了一个小的C程序,它执行以下步骤:
- 从标准输入中读取一些输入并将输入存储到内存中。
- 运行一些计算并将输出打印到标准音频
$ ./simple < input.in
我想在读取文件后将标准输入重定向到键盘,但不确定如何执行此操作。我已尝试使用
fclose(stdin);
freopen("newin", "r", stdin);
但此后标准输入无法从键盘读取。如有任何关于如何做到这一点的建议,我们将不胜感激。
进一步说明:
- 真正的程序比这复杂得多,但Simple仍然说明了我的问题。
- 这是因为我希望在执行期间暂停我的程序,以便有足够的时间将"简单"的进程加载到名为Instruments for Performance分析的OSX应用程序中。
- 如果有帮助,下面提供了更多示例代码。
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
", 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);
...
}
在这两种情况下,都不可能使用外壳管道自动执行交互响应,但这似乎是您想要的。读取/dev/tty
是同时支持输入重定向和交互工作的命令行程序中的标准做法,例如某些Unix编辑器。
这篇关于C将标准输入重定向到键盘的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文