使用conio.h的另一个头

时间:2015-12-01 16:20:12

标签: c++ header ncurses conio

我想在Ubuntu上编写一个C ++程序, 它会立即对输入做出反应,而无需按下输入。 ( - &gt;由于我在UNIX系统上工作的原因,我无法使用标头#include <conio.h>

例如: 我在键盘上按下键“a”,但不是在终端显示“a”, 该程序应显示“p”。

过去两天,我尝试使用标题#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 个答案:

答案 0 :(得分:2)

如果您想要的只是旧ConIO 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; } ()的快速替换,则以下代码就足够了。

getch()

但请注意,旧的DOS ConIO是UNIX Curses软件包的精简版本,它提供了文本终端屏幕操作所需的一切。

编辑:无论如何,诅咒肯定是要走的路。如果您想要处理箭头或功能键,而不必为每种类型的终端知道与它们相关的转义序列而烦恼,那么您应该学习 Curses 及其自己的版本{{ 1}}。

此外,如果您认为您需要使用UTF-8或任何其他多字节表示来支持ASCII范围以外的字符,那么您最好使用 ncursesw 库& #39; s函数get_wch()及其姐妹。