Программирование на C: Как мне прочесть ввод с терминала, если по трубопроводу поступает сигнал от стандартного ввода? - PullRequest
4 голосов
/ 20 марта 2012

Итак, я пытаюсь написать программу переменного тока, которая считывает входные данные, переданные по каналу в программу (через 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 ]

3 голосов
/ 20 марта 2012

Проблема в том, что вы используете одинарные кавычки вместо двойных:

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

должно быть

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

Вот прототип fdopen:

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

Ожидается char*, но вы передаете его char.

0 голосов
/ 20 марта 2012

Если у вас есть другой входной канал, он заменит 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
}
...