C编程:如果从stdin管道输入,如何读取端子输入?

时间:2012-03-19 23:07:48

标签: c linux stdio

所以,我正在尝试编写ac程序,将输入管道读入程序(通过stdin),但我还需要能够从终端读取输入(所以我显然无法从stdin读取它) 。我该怎么办? 我正在尝试打开/ dev / tty的另一个文件句柄:

int see_more() {
    char response;
    int rd = open("/dev/tty", O_RDWR);
    FILE* reader = fdopen(rd, "r");
    while ((response = getc(reader)) != EOF) {
        switch (response) {
            case 'q':
                return 0;
            case ' ':
                return 1;
            case '\n':
                return -1;
        }
    }
}

但这会导致分段错误。

这是适用的版本。感谢大家的帮助:)

int see_more() {
    char response;
    while (read(2, &response, 1)) {
        switch (response) {
            case 'q':
                return 0;
            case ' ':
                return 1;
            case '\n':
                return -1;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

问题是你使用的是单引号而不是双引号:

FILE* reader = fdopen(rd, 'r');

应该是

FILE* reader = fdopen(rd, "r");

以下是fdopen的原型:

FILE *fdopen(int fildes, const char *mode);

它需要char*,但您传递char

答案 1 :(得分:0)

如果你有另一个管道输入,那么它将用该输入文件替换stdin(终端)。如果您想从终端获取输入,我建议将该文件作为参数而不是管道,然后您可以正常使用stdin。

这是一个例子。

执行:

./a.out foo.txt

代码:

int main(int argc, char* argv[])
{
    if (argc >= 2)
    {
        char* filename = argv[1];
    }
    else
    {
        // no filename given
        return 1;
    }

    // open file and read from that instead of using stdin
    // use stdin normally later
}