Я хотел бы написать программу на C ++ в Ubuntu,
который немедленно реагирует на ввод без нажатия кнопки ввода.
(-> Я не могу использовать заголовок #include <conio.h>
по той причине, что я работаю в системе UNIX)
Например:
Я нажимаю на клавиатуре клавишу «а», но вместо того, чтобы показывать «а» в терминале,
программа должна показать «р».
Последние два дня пытался сделать это с помощью шапки #include <ncurses.h>
,
К сожалению, это не работает.
Поэтому я хотел бы попросить вашего запроса.
С conio.h это было бы так:
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
int main(void)
{
char c;
c = getch();
while(true)
{
if(c=='a')
{
putch('p');
}
else
{
putch(c);
}
c = getch();
}
cin.sync();
cin.get();
}
Можете ли вы просто опубликовать рабочий исходный код с #include <ncurses.h>
вместо #include <conio.h>
?
Огромное спасибо заранее!!!
С наилучшими пожеланиями
quark42
Спасибо Paulo1205!!!!
Вот мой окончательный код без conio.h:
#include <iostream>
#include <string>
#include <unistd.h>
#include <termios.h>
#include <ncurses.h>
using namespace std;
int my_getch(void){
struct termios oldattr, newattr;
unsigned char ch;
int retcode;
tcgetattr(STDIN_FILENO, &oldattr);
newattr=oldattr;
newattr.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newattr);
retcode=read(STDIN_FILENO, &ch, 1);
tcsetattr(STDIN_FILENO, TCSANOW, &oldattr);
return retcode<=0? EOF: (int)ch;
}int main(void)
{
char c;
c = my_getch();
while(true)
{
if(c=='a')
{
putchar('p'); fflush(stdout);
}
else
{
putchar(c); fflush(stdout);
}
c = my_getch();
}
cin.sync();
cin.get();
}
Если все, что вам нужно, это быстрая замена старого ConIO getch
(), достаточно следующего кода.
int my_getch(void){
struct termios oldattr, newattr;
unsigned char ch;
int retcode;
tcgetattr(STDIN_FILENO, &oldattr);
newattr=oldattr;
newattr.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newattr);
retcode=read(STDIN_FILENO, &ch, 1);
tcsetattr(STDIN_FILENO, TCSANOW, &oldattr);
return retcode<=0? EOF: (int)ch;
}
Однако обратите внимание, что старый DOS ConIO является урезанной версией пакета UNIX Curses, который предоставляет все необходимое для операций на экране текстового терминала.
РЕДАКТИРОВАТЬ: Во всяком случае, проклятия — это путь. Если вы когда-нибудь захотите разобраться со стрелками или функциональными клавишами, не заботясь о знании escape-последовательностей, связанных с ними, для каждого типа терминала, вам лучше изучить Проклятия и своя версия getch()
,
Кроме того, если вы думаете, что вам когда-нибудь понадобится поддержка символов вне диапазона ASCII с UTF-8 или любым другим многобайтовым представлением, вам лучше использовать ncursesw функция библиотеки get_wch()
и его сестры.
Других решений пока нет …