View Full Version : Acquisizione caratteri da tastiera sotto linux
NetTitus
28-04-2004, 16:32
Salve a tutti!!:D
Ho un problema nell'acquisizione singola dei tasti premuti da tastiera con il C++ (G++ in ambiente linux).
Mi spiego, in Windows esiste una funzione fgetch() che "legge" un
carattere alla volta senza aspettare che premi invio.
In linux non esiste (non sono riuscito a trovare) una funzione simile che faccia al mio caso (infatti cin inserisce nello stream fino a quando premo invio ).
Cosa posso fare ??
:confused: :confused:
Saluti:) :)
ilsensine
28-04-2004, 16:36
stdin è line-buffered, devi renderla char-buffered (ed opzionalmente non bloccante). v. man termios, in particolare tcsetattr.
Ho postato del codice su questo argomento diverso tempo fa; se non riesci a trovarlo ti do una mano.
NetTitus
28-04-2004, 16:43
Grazie per l'aiuto che mi stai dando :).
Ho trovato questo a riguardo
tcsetattr() sets the parameters associated with the termi-
nal (unless support is required from the underlying hard-
ware that is not available) from the termios structure
referred to by termios_p. optional_actions specifies when
the changes take effect:
Ma non ho capito bene cosa devo fare (mi sembra un po' complesso):confused:
Saluti:)
ilsensine
28-04-2004, 16:53
struct termios new_tty;
struct termios old_tty;
tcgetattr(fileno(stdin), &old_tty);
new_tty = old_tty;
new_tty.c_lflag &= ~ICANON;
// Decommenta questa riga se vuoi togliere l'eco dei caratteri
// new_tty.c_lflag &= ~ECHO;
new_tty.c_cc[VMIN] = 1;
new_tty.c_cc[VTIME] = 0;
tcsetattr(fileno(stdin), TCSAFLUSH, &new_tty);
Ora stdin legge un carattere alla volta, ma è sempre bloccante. Se vuoi vedere quanti caratteri ci sono da leggere, esegui
int cnt;
ioctl(fileno(stdin), FIONREAD, &cnt);
Per leggere un carattere, puoi usare una normale read (ricorda che se non ci sono caratteri in ingresso, è bloccante):
char ch;
read(fileno(stdin), &ch, 1);
Ricorda ti ripristinare old_tty prima di terminare il programma.
NetTitus
28-04-2004, 17:43
Grazie mille!!:D
Pero' ho un'altro problema : l'attesa di un carattere. :cry:
Es.
Pensa se devi creare un flipper che comandicon la tastiera in Linux ;) se e' bloccante non riesci e gestire altri eventi che devi gestire continuamente (pensa al movimento della pallina) :) .
Esiste un modo in linux per gestire cio' ??:confused:
Come si puo' creare un'interfaccia ad eventi se c'e' una funzione bloccante ??:confused:
Saluti !
http://forum.hwupgrade.it/showthread.php?s=&threadid=666664&highlight=getch
Scommetto che eri un utente Borland ;)
NetTitus
28-04-2004, 18:03
Esatto !!;)
Eh la borland fa funzioni veramente efficenti e semplici per il programmatore.:p
Avresti dell'altro materiale a riguardo ??
Grazie mille per l'aiuto che mi hai dato finora.:cool: :cool:
Mi piacerebbe specializzarmi di piu' con il C++ in linux con compilatori freeware potenti.:)
Saluti!:p
Mi sembra che ci sia già abbastanza materiale...hai guardato nei link ?
#include <curses.h>
int main(){
WINDOW *w;
int c;
w = initscr();
cbreak(); /* no line buffering */
nodelay(w, TRUE); /* make getch call non blocking */
while(1){
if((c = getch()) != ERR) break; /* if(kbhit()) break; */
}
endwin();
return 0;
}
ilsensine
28-04-2004, 20:32
Originariamente inviato da NetTitus
Pero' ho un'altro problema : l'attesa di un carattere. :cry:
Es.
Pensa se devi creare un flipper che comandicon la tastiera in Linux ;) se e' bloccante non riesci e gestire altri eventi che devi gestire continuamente (pensa al movimento della pallina) :) .
Esiste un modo in linux per gestire cio' ??:confused:
Secondo te la ioctl che te la ho postata a fare?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.