Использование другого заголовка для conio.h

Я хотел бы написать программу на 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();
}

1

Решение

Если все, что вам нужно, это быстрая замена старого 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() и его сестры.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector