Приложение ncurses в C - чтение стандартного ввода

Я пишу упрощенную версию стандартной команды 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:
        ...
    }
}

...

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

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


person PiotrK    schedule 16.12.2011    source источник
comment
Добавьте ответ на свой вопрос! Затем через день или около того вы также можете принять его.   -  person Prof. Falken    schedule 16.12.2011
comment
Я хотел так сделать, но у меня слишком маленькая репутация, чтобы сделать это сразу ;) Пользователи с репутацией менее 100 не могут ответить на свой вопрос в течение 8 часов после вопроса.   -  person PiotrK    schedule 17.12.2011


Ответы (1)


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

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