Debian Linux C++ как сделать бесконечный цикл нажатия клавиш

Я хочу, чтобы бесконечный цикл прерывался, когда я нажимаю клавишу «q» на клавиатуре. Проблемы, о которых я не знал: стандартный getchar ждет, пока пользователь сделает ввод и нажмет Enter, что остановит выполнение цикла.

Я обошел проблему «входа», но цикл все еще останавливается и ждет ввода.

вот мой код:

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

int getch(void); // Declare of new function

int main (void) { char x;

do 
{ 
   if (x = getch())
      printf ("Got It! \n!); 
   else 
   { 
      delay(2000);
      printf ("Not yet\n!); 
   }

}while x != 'q');

return 0;
}


int getch(void)
{
int ch;
struct termios oldt;
struct termios newt;

tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return ch;
}

person Christian    schedule 17.08.2012    source источник
comment
Вы уверены, что скомпилировали этот код? Есть синтаксические ошибки. Почему вы назначаете переменную в if?   -  person Leri    schedule 17.08.2012
comment
Почему это помечено как «С++»? Для меня это выглядит как старый добрый C.   -  person tdammers    schedule 17.08.2012


Ответы (2)


Вы можете прочитать их с устройства:

#define INPUT_QUEUE "/dev/input/event0"
#define EVENT_LEN 16

void readEventLine(FILE * in, char * data) {    //read input key stream
  int i;
  for(i = 0; i <= 15; i++) {    //each key press will trigger 16 characters of data,    describing the event
    data[i] = (char) fgetc(in);
  }
}

int readKeyPress() {

  FILE * input;
  char data[EVENT_LEN];

  input = fopen(INPUT_QUEUE, "r+");
  readEventLine(input, data);
}

Просто вызовите что-то вроде этого вместо вашего getch.

Адаптировано с http://www.cplusplus.com/forum/unices/8206/

person Jasper van den Bosch    schedule 17.08.2012
comment
readKeyPress не должен возвращать что-то... например, в конце add do{ collect =+ data[i]; я--; } пока (i‹0); возврат собран; - person Christian; 17.08.2012
comment
Да, вместо сохранения в переменную data он мог бы вернуть значение. Не стесняйтесь редактировать пример. - person Jasper van den Bosch; 17.08.2012

Мне пришлось сделать следующее, чтобы заставить его работать правильно, спасибо за вклад!

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <unistd.h> 
#include <termios.h> 
#include <fcntl.h>

int getch(void); // Declare of new function 

int main (void) 
{ 

char x; 

do  
{  
x = getch();
        if (x != EOF)
        {
            printf ("\r%s\n", "Got something:");
            printf ("it's %c!",x); //  %c - for character %d - for ascii number   
}else  
   {  
      delay(2000); 
      printf ("Not yet\n!);  
   } 

}while x != 'q'); 

return 0; 
} 


int getch(void)
{
    int ch;
    struct termios oldt;
    struct termios newt;
    long oldf;
    long newf;

    tcgetattr(STDIN_FILENO, &oldt);             /* Store old settings */
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);           /* Make one change to old settings in new settings */
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);    /* Apply the changes immediatly */

    oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
    newf = oldf | O_NONBLOCK;
    fcntl(STDIN_FILENO, F_SETFL, newf);

    ch = getchar();
    fcntl(STDIN_FILENO, F_SETFL, oldf);
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);    /* Reapply the old settings */
    return ch;
}
person Christian    schedule 08.09.2012