C将标准输入重定向到键盘 [英] C redirect stdin to keyboard

查看:11
本文介绍了C将标准输入重定向到键盘的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Mac OSX上编写了一个小的C程序,它执行以下步骤:

  1. 从标准输入中读取一些输入并将输入存储到内存中。
  2. 运行一些计算并将输出打印到标准音频
在第1步和第2步之间,我希望提示用户并等待某种键盘输入,以发出"继续进行到第2步"的信号。问题是在使用以下命令调用程序时,stdin已被重定向:

$ ./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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆