Приложение ncurses на C - чтение стандартного ввода - PullRequest
3 голосов
/ 16 декабря 2011

Я пишу упрощенную версию стандартной команды Linux less для академических классов ОС, и мне разрешено использовать ncurses, чтобы упростить ее.«Упрощенный» означает, что пользователь должен иметь возможность прокручивать представление с помощью стрелок, PgUp, PgDown, а также использовать команды перехода g и G.Кроме того, программа должна читать входные данные либо из файла (его имя задается в качестве параметра), либо из стандартного потока ввода, например

echo "test" | ./less

Чтение из файла было простым (в данном случае проблем нет), проблемапроисходит, когда я использую оператор конвейера - getch () продолжает возвращать -1 (EOF) и не отвечает ни на какие нажатия клавиш.Мой текущий код выглядит так:

char c;

while((c = fget(stdin)) != EOF)
{
    // reading from stdin char by char, let's say
}

// enabling ncurses mode
initscr();
keypad(stdscr, TRUE);
noecho();
cbreak();

int ch;

while(true)
{
    ch = getch();

    switch(ch)
    {
        case KEY_LEFT:
        ...
    }
}

...

Я думал, что это вопрос очистки потока, но ни одно из подобных решений не помогло мне.Я читаю все данные из stdin до самого конца (EOF), поэтому не понимаю, почему EOF остается в буфере.

Есть ли обходной путь для этого?Я просматривал похожие вопросы, но я не нашел никакой подсказки для моей проблемы.Может быть, ncurses не является хорошим решением для моей задачи?

1 Ответ

2 голосов
/ 17 декабря 2011

Проблема решена, я добавил одну строку перед входом в режим ncurses:

...
freopen("/dev/tty", "rw", stdin);
// enabling ncurses mode
initscr();
...
...