Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ Linux » getch()

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.11.2003, 09:47 Uhr
derphilipder



Hi!
In der FH arbeiten wir an Unix-Rechnern (bin ich hier in der richtigen Kategorie?)
Ich habe kürzlich meinen Prof nach einer Funktion wie getch() gefragt, die der GNU-Unix-Compiler offensichtlich nicht kennt und ihm erklärt, was die Funktion macht.
Daraufhin sagte er mir, dass unter Unix das direkte Einlesen eines Zeichens generell nicht möglich sei weil jede Eingabe zwingend mit Return abgeschlossen werden müsse.

Ist das so richtig?
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.11.2003, 10:17 Uhr
virtual
Sexiest Bit alive
(Operator)


Von einem Professor würde ich eine differenziertere Antwort erwarten.

Es gibt ein getch(), nämlich in der (n)curses library. Und das macht ganz genau das, was du willst.

Wenn Du ein programm ausführst, ist stdin meist zeilengepuffert. Dies kann man aufheben und unbiffered IO einstellen. (n)curses macht das so.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.11.2003, 10:52 Uhr
derphilipder



Das hört sich schonmal gut an!
Ich bin mir jetzt aber nicht ganz sicher, was ich machen muss
(Ich Nullpeiler ).

Wie gesagt, wenn ich getch() verwende, sagt der Compiler, dass er es nicht kennt.
Muss ich dafür noch irgendein H-file einfügen?
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.11.2003, 11:27 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja. curses.h Includieren und mit -lncurses bzw. lcurses linken.
Das ist aber nicht alles: Du musst dann die gesamte Ein/Ausgabe auf Curses umstellen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.11.2003, 17:47 Uhr
0xdeadbeef
Gott
(Operator)


Das ist wahrscheinlich nicht das, was du willst. Die einfachere Möglichkeit wäre, per termio.h das Terminal auf unbuffered zu stellen. Ich poste den Code hier nochmal (inzwischen zum vierten oder so), und dann schiebe ich diesen Thread in die Linux-FAQ.

C++:
#include <stdio.h>
#include <termios.h>

void setTerminalBuffering(int new_state) {
    static struct termios stored_settings;
    static int old_state = 1;
    if(!old_state == !new_state) return; //nix zu tun
    old_state = new_state;
    if(!new_state) {
        struct termios new_settings;
        tcgetattr(0,&stored_settings);
        new_settings = stored_settings;
        new_settings.c_lflag &= (~ICANON);
        new_settings.c_cc[VTIME] = 0;
        tcgetattr(0,&stored_settings);
        new_settings.c_cc[VMIN] = 1;
        tcsetattr(0,TCSANOW,&new_settings);
    } else {
        tcsetattr(0,TCSANOW,&stored_settings);
    }
}

int main() {
    setTerminalBuffering(0); //ab jetzt geht getchar() wie getch()
    printf("\n%c\n", getchar());
    setTerminalBuffering(1); //jetzt will getchar() wieder ein return haben
    return 0;
}


Damit ist es dann auch möglich, ein getch() zu bauen:

C++:
int getch() {
  int ret;
  setTerminalBuffering(0);
  ret = getchar();
  setTerminalBuffering(1);
  return ret;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 01.12.2004 um 00:35 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ FAQ Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: