C将stdin重定向到键盘

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

  • 从标准输入读取一些输入并将输入存储到内存中。
  • 运行一些计算并将输出打印到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", "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编辑器。

    链接地址: http://www.djcxy.com/p/20753.html

    上一篇: C redirect stdin to keyboard

    下一篇: Strange version shown for a Windows Phone 8.1 XAML app