004
14.08.2003, 20:31 Uhr
Marzel
|
...das funktioniert unter Windows??: www.eskimo.com/~scs/C-faq/q12.26.html
... die Unix Lösung funktioniert bei mir nicht wie gewünscht.
allerdings hab ich zu meinem 1.Problem
>> wie kann ich std::cin auslesen ohne dass Return gedrückt wurde. (kann man irgendwie definieren, >>nach welchem zeichen, die eingabe beendet sein soll (defaultmässig newline))
eine system-spezifische(denke ich) Lösung gefunden (linux):
code ursprünglich von: www.h.eng.cam.ac.uk/help/tpl/languages/C++/FAQ.html#3 (hier im Forum ist übrigens ein Bug bei der Umwandlung der links: www-h.eng.cam.ac.uk/help/tpl/languages/C++/FAQ.html#3 ( www-h statt www.h ) )
..hab ich jedoch geändert da paar Fehler drin waren (warum auch immer) Bei mir läuft es jetzt jedenfalls.
C++: |
#include <iostream> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <termios.h>
int tty_mode = 0; struct termios orig_tty; struct termios new_tty;
// Sets up terminal for one-char-at-a-time reads void cbreak (void) { if (tty_mode == 0) { tcgetattr(0, &orig_tty); tty_mode = 1; new_tty = orig_tty; }
new_tty.c_lflag &= ~(ICANON | ECHO); new_tty.c_cc[VMIN] = 1; new_tty.c_cc[VTIME] = 0; tcsetattr(0, TCSANOW, &new_tty); }
// Returns terminal to normal state after cbreak () void normal (void) { if (tty_mode == 1) { tcsetattr(0, TCSANOW, &orig_tty); new_tty = orig_tty; } }
// Checks keyboard buffer (stdin) and returns key // pressed, or -1 for no key pressed
int keypress (void) { static char keypressed; struct timeval waittime; int num_chars_read; fd_set mask; FD_SET(0, &mask);
waittime.tv_sec = 0; waittime.tv_usec = 0; if (select (1, &mask, 0, 0, &waittime)) { num_chars_read = read (0, &keypressed, 1); if (num_chars_read == 1) return ((int)keypressed); }
return (-1); }
int main() { char c; normal(); std::cout << "type a character (normal mode): "; std::cin >> c; cbreak(); std::cout << "type a character (non-blocking): "; while ( keypress() == -1) { std::cout << "ok, I'll wait a second" << std::endl; sleep(1); } std::cout << "Thanks. Returning to normal behaviour" << std::endl; normal(); return 0; }
|
Dieser Post wurde am 14.08.2003 um 20:35 Uhr von Marzel editiert. |