开发者

How to implement getch() function of C in Linux?

开发者 https://www.devze.com 2023-01-08 07:32 出处:网络
In TurboC++, I can use the getch() function fr开发者_开发知识库om conio.h. But in Linux, gcc doesn\'t provide conio.h. How can I get the functionality of getch()?Try this conio.h file:

In TurboC++, I can use the getch() function fr开发者_开发知识库om conio.h. But in Linux, gcc doesn't provide conio.h. How can I get the functionality of getch()?


Try this conio.h file:

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

/* reads from keypress, doesn't echo */
int getch(void)
{
    struct termios oldattr, newattr;
    int ch;
    tcgetattr( STDIN_FILENO, &oldattr );
    newattr = oldattr;
    newattr.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
    return ch;
}

/* reads from keypress, echoes */
int getche(void)
{
    struct termios oldattr, newattr;
    int ch;
    tcgetattr( STDIN_FILENO, &oldattr );
    newattr = oldattr;
    newattr.c_lflag &= ~( ICANON );
    tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
    return ch;
}

You can also use the ncurses library in gcc for some functions similar to conio.h.


If echoing to the screen is not a problem, you could try using getchar() from stdio.h.


Check out curses:

http://en.wikipedia.org/wiki/Curses_%28programming_library%29


getch() seems to be included in curses library.


According to these solution code you must manually use open source code for getch() and getche() function as described the code is as following .

#include <termios.h>
#include <stdio.h>

static struct termios old, new;

/* Initialize new terminal i/o settings */
void initTermios(int echo) 
{
  tcgetattr(0, &old); /* grab old terminal i/o settings */
  new = old; /* make new settings same as old settings */
  new.c_lflag &= ~ICANON; /* disable buffered i/o */
  new.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */
  tcsetattr(0, TCSANOW, &new); /* use these new terminal i/o settings now */
}

/* Restore old terminal i/o settings */
void resetTermios(void) 
{
  tcsetattr(0, TCSANOW, &old);
}

/* Read 1 character - echo defines echo mode */
char getch_(int echo) 
{
  char ch;
  initTermios(echo);
  ch = getchar();
  resetTermios();
  return ch;
}

/* Read 1 character without echo */
char getch(void) 
{
  return getch_(0);
}

/* Read 1 character with echo */
char getche(void) 
{
  return getch_(1);
}

Just put it before your main method of code


You can use getch() equivalent from libcaca:

__extern int caca_conio_getch (void)


If, for any reasons, you can't use curses, try this:

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include <termios.h>

/* get a single char from stdin    */
int getch(void)
{
   struct termios oldattr, newattr;
   int ch;
   tcgetattr(0, &oldattr);
   newattr=oldattr;
   newattr.c_lflag &= ~( ICANON | ECHO );
   tcsetattr( 0, TCSANOW, &newattr);
   ch=getchar();
   tcsetattr(0, TCSANOW, &oldattr);
   return(ch);
}


In Unix, getch() is part of the ncurses library. But I wrote a workaround for this question that lets you use getch-like functionality without the rest of the curses baggage.


conio.h is only in Dos,

for linux, use

sudo apt-get install libncurses-dev

& then

-lncurses

// In IDE, you have to link it: for example: codeblocks, Setting -> Compiler -> Linker setting, and add 'ncurses'


getch() is in libcurses. the use of curses is a bit more complex because it has deep links to the underlying terminal and has to be initialized. a working example for curses getch() with initialization of libcurses is in getchar() returns the same value (27) for up and down arrow keys


You can also use system command to control the terminal in linux like this

char getch()    {

        char c;

        system("stty raw -echo");

        c = getchar();

        system("stty -raw echo");

        return c;

}

This function does not requires the user to press enter and takes input from the user without echoing It requires you to add stdlib.h library to your code

Note : This function is only applicable to UNIX-based OS

Any improvements or pointing out any issues in the code will be appreciated

Regards


If you want to use conio.h on Ubuntu, then follow these steps:-

  1. Open terminal
  2. sudo apt-get install git
  3. git clone https://github.com/zoelabbb/conio.h.git
  4. cd conio.h
  5. sudo mv conio.h /usr/include/
  6. Close your IDE and open again. Done.

If you are in trouble then follow this link: enter link description here

0

精彩评论

暂无评论...
验证码 换一张
取 消