如何在 C 中读取 stdin 然后键盘输入?

How to read stdin then keyboard input in C?

提问人:Pete Mitchell 提问时间:9/3/2021 更新时间:9/3/2021 访问量:545

问:

我正在尝试读取重定向/通过管道传输到我的程序的内容(例如程序<测试.txt),然后显示命令提示符并读取键盘输入。

管道输入正确打印,然后在 stdin 中引发 EOF。在那之后,我似乎无法获得键盘输入。例如,以下代码无限循环:它打印的字符为 -1 (EOF)。

您有什么建议来让键盘输入正常工作?

#include <stdio.h>
#include <unistd.h>

int main()
{
    int ch;

    while (EOF != (ch = getchar())) {
        printf("%c", ch);
    }

    sleep(3);

    while (1) {
        while ('\n' != (ch = getchar())) {
            printf("%c", ch);
        }
    }

    return 0;
}
C 键盘 stdin eof getchar

评论

1赞 Cheatah 9/3/2021
这将是你的程序工作方式的一种非常奇怪的方式。不要试图做一些对别人来说非常不直观的东西。程序要么接受键盘输入,要么接受文件输入流(或从另一个程序获取 stdout)。如果你想读取一个文件,请使用程序参数,例如,这对控制台用户来说更有意义。./command -f config
1赞 Jonathon S. 9/3/2021
不是 100% 确定这会起作用,但也许可以在这里检查:stackoverflow.com/questions/23978444/....我认为如果您从文件定向到 stdin,您可能需要在程序中执行一些操作,以将 stdin 设置为从键盘馈送。
1赞 Shawn 9/3/2021
当 stdin 是其他东西时,您也许可以在某些操作系统上打开以获取控制台输入。/dev/tty
0赞 Pete Mitchell 9/3/2021
@Cheetah 我从代码中省略了一些处理。从 stdin 和键盘读取是程序在不同时间的不同部分。但 stdin 在处理后仍处于 EOF 状态。
0赞 Pete Mitchell 9/3/2021
@Shawn,Jonathon S. 谢谢。我做了更多的研究和 FILE *tty = fopen(“/dev/tty”, “r”);在Unix上工作。

答: 暂无答案