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) Этот урок содержит много полезной информации, которая также может помочь: