C将stdin重定向到键盘

C将stdin重定向到键盘,第1张

概述我在Mac OSX上编写了一个小型C程序,它执行以下步骤: >从stdin读取一些输入并将输入存储到内存中. >运行一些计算并将输出打印到stdio 在步骤1和2之间,我想提示用户并等待某种键盘输入以发出“继续进行到步骤2”的信号.问题是当使用命令调用程序时,stdin已被重定向: $./simple < input.in 我想在读取文件后将stdin重定向到键盘,我不知道该怎么做.我试过用 fc 我在Mac OSX上编写了一个小型C程序,它执行以下步骤:

>从stdin读取一些输入并将输入存储到内存中.
>运行一些计算并将输出打印到stdio

在步骤1和2之间,我想提示用户并等待某种键盘输入以发出“继续进行到步骤2”的信号.问题是当使用命令调用程序时,stdin已被重定向:

$./simple < input.in

我想在读取文件后将stdin重定向到键盘,我不知道该怎么做.我试过用

fclose(stdin);freopen("newin","r",stdin);

但此后stdin无法从键盘上读取.任何有关如何做到这一点的建议将不胜感激.

还有一些要点:

>真正的程序比这更复杂,但简单仍然说明了我的问题.
>原因是我想在执行期间暂停我的程序,以便我有足够的时间将“简单”过程加载到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",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;}
解决方法 除非您有一个名为newin的文件,否则您的freopen调用将失败. (此外,在调用freopen之前,不得关闭流,因为freopen需要一个有效的流,它会因副作用而关闭.)要重新打开要从终端读取的标准输入,需要指定/ dev / tty作为文件名称:
if (!freopen("/dev/tty",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,tty);...}

在任何一种情况下,都不可能使用shell管道自动化交互式响应,但这似乎是你想要的.从/ dev / tty读取是支持输入重定向和交互式工作的命令行程序的标准做法,例如一些Unix编辑器.

总结

以上是内存溢出为你收集整理的C将stdin重定向到键盘全部内容,希望文章能够帮你解决C将stdin重定向到键盘所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238301.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存