getch и putchar не работают без возврата

Я пытался получить getch работать в другой программе без успеха. Таким образом, я сделал самую основную программу, которую я могу использовать getch так, как я хочу, чтобы он работал в основной программе.

Я исследовал необходимость noecho, cbreak, initscr а также nodelayЯ также пытался использовать newscr() но безуспешно.

У меня проблема в том, что символы не выводятся на экран, пока я не нажму "ввод", когда они должны быть put на экран каждый цикл. Почему это происходит? Также курсор не возвращается в левую часть экрана на новой строке. например.

abc  
   def
      ghi

Я искал ответ, но снова в тупик...

#include <stdio.h>
#include <ncurses.h>

int main()
  {
     initscr();cbreak(); noecho();nodelay(stdscr,0);
    char c ;
    while((c=getch())!=EOF){
    putchar(c);}

    return 0;
  }

2 ответа

Решение

Вы не видите результат, потому что ваш stdout Поток буферизован.

Ваша программа получает индивидуальные символы в порядке; но выходной поток их буферизует.

Пытаться fflush(stdout); или переключение stdout в небуферизованный режим с setbuf(stdout, NULL);,

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

Вы можете сделать это условным для стандартного вывода tty:

if (isatty(fileno(stdout)))  /* #include <unistd.h> */
  setbuf(stdout, NULL);

Чтобы вернуть курсор в начало строки, нужно вывести возврат каретки \r, Это потому что проклятия cbreak режим отключил ONLCR Режим tty (на выходе, при отправке NL добавить CR).

Если вы безоговорочно добавляете \r, затем он появится в файлах, когда ваш вывод будет перенаправлен. Итак, снова вам нужно немного isatty хак.

Намного лучше было бы узнать, как использовать tcgetattr а также tcsetattr функции для точного управления определенными параметрами tty, если все, что вам нужно, - это вводить символ за разом без эха, а не разрабатывать интерактивную программу на основе проклятий.

Вы действительно хотите вводить символ за разом или просто набирать эхо? Это легко отключить эхо. Вызов tcgetattr заполнить struct termios с текущими настройками дескриптора файла 0 (если это tty). Переверните несколько флагов, чтобы отключить эхо, затем позвоните tcsetattr установить обновленную структуру. Когда ваша программа выйдет, будьте добры и верните оригинал. Готово.

Да, ncurses - хороший способ получить посимвольное управление.

И да, вы должны вызывать "initscr()" и "cbreak ()".

SUGGESTIONS:

1) Сравните ваш код с этим ncurses "Здравствуй, мир":

#include <ncurses.h>

int main()
{   
    initscr();          /* Start curses mode          */
    printw("Hello World !!!");  /* Print Hello World          */
    refresh();          /* Print it on to the real screen */
    getch();            /* Wait for user input */
    endwin();           /* End curses mode        */

    return 0;
}

2) Посмотрите, что произойдет, если вы выполните "refresh()" и / или удалите "noecho ()".

3) Этот урок содержит много полезной информации, которая также может помочь:

http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/

Другие вопросы по тегам