PDA

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 !

cionci
28-04-2004, 17:54
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

cionci
28-04-2004, 18:13
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?