ESC und Entertasten abfangen

OP #2300046
Lesenswert?
• ▲
▼
Hallo!

ich möchte unter Linux (debian sarge, gcc) ein Konsolenprogramm 
schreiben. Um Benutzereingaben entgegenzunehmen wollte ich eigentlich 
mit kbhit() und getch() die Zeichen einzeln einlesen und entsprechend 
reagieren. Allerdings gibt es die conio.h unter Linux nicht.
Hat da jemand eine Lösung?  ich versuche jetzt zwei kleine Programme zu 
schreiben:
das erste solle dem  Benutzer ermöglichen eine wert eins Variables 
zuändern oder sein alte Wert zu behalten wenn er Enter taste drückt:
1
  
2
  char wahl;
3
  int b=10;
4
  cout<<"b="<<b<<endl;
5
  
6
  do{
7
    cout<< "Bitte geben Sie ein:"<<endl;
8
    cout<< "Taste a: ändern"<<endl;
9
    cout<< "Tase  Enter : alte Wert von b behalten "<<endl;
10
    cin>> wahl;
11
    
12
    switch(wahl){
13
      
14
    case 'a': 
15
      cout<<"Wert für b eingeben:"<<endl; 
16
      cin>>b;
17
      cout<<"neue Wert von b ist "<<b<<endl;
18
      break;
19
      
20
    case'VK_RETURN' :      
21
      b=b;   
22
      cout<<"b="<<b<<endl;
23
      
24
      break;
25
      
26
    default : 
27
      cout<<"falche eingabe"<<endl;
28
    }   
29
  }while((wahl =='a')||(wahl=='VK_RETURN'));
30
  
31
  return 0;
32
}
aber cin kann  die sonder Zeichen nicht einlesen.


mein zweite Programm soll beendet wird wenn die ESC Taste gedrückt wird:
1
do{
2
  cin<<wahl;
3
  switch(wahl){
4
    
5
  case 'a' : 
6
    // anweisung
7
    break;
8
  case 'b':
9
    //anweisung
10
    break;
11
  case 'c':
12
    //Anweisung
13
    break;
14
  default:
15
    break;
16
  }while(wahl !=VK_ESCAPE);
17
  
18
 return 0;
19
}
20

21
hat jamend  für mich eine Idee wie ich meine Programme zum laufen bringen kann.
22

23
Danke schönmal im Voraus
24

25
Gruß
26

27
Seb
OP #2300213
Lesenswert?
• ▲
▼
habe es eben probiert aber es hängt bei ausführung wenn ich enter drücke
1
using namespace std;
2
int main( int argc, char *argv[]) {
3

4
  
5
  char wahl;
6
  int b=10;
7
  cout<<"b="<<b<<endl;
8
  
9
  do{
10
    cout<< "Bitte geben Sie ein:"<<endl;
11
    cout<< "Taste a: ändern"<<endl;
12
    cout<< "Tase  Enter : alte Wert von b behalten "<<endl;
13
    cin>> wahl;
14
    
15
    switch(wahl){
16
      
17
    case 'a': 
18
      cout<<"Wert für b eingeben:"<<endl; 
19
      cin>>b;
20
      cout<<"neue Wert von b ist "<<b<<endl;
21
      break;
22
      
23
    case 'x0d' :      
24
      b=b;   
25
      cout<<"b="<<b<<endl;
26
      
27
      break;
28
      
29
    default : 
30
      cout<<"falche eingabe"<<endl;
31
    }   
32
  }while((wahl =='a')||(wahl== 'x0d' ));
33
  
34
  return 0;
35
}
Gast #2300546
Lesenswert?
• ▲
▼
gerbej seb schrieb:
> Hallo!
>
> ich möchte unter Linux (debian sarge, gcc) ein Konsolenprogramm
> schreiben. Um Benutzereingaben entgegenzunehmen wollte ich eigentlich
> mit kbhit() und getch() die Zeichen einzeln einlesen und entsprechend
> reagieren. Allerdings gibt es die conio.h unter Linux nicht.

Wirklich ganz steinalter DOS-Dreck, gibt es latürnich nicht unter 
Linux...

> Hat da jemand eine Lösung?  ich versuche jetzt zwei kleine Programme zu
> schreiben:

Meines Wissens nimmt man für sowas eine Library namens "ncurses", siehe 
deren Doku.
OP #2301350
Lesenswert?
• ▲
▼
Rufus Τ. Firefly schrieb:
> gerbej seb schrieb:
>> case 'x0d' :
>
> Habe ich das so geschrieben?
>
> Nein. Was wohl macht der \, den ich davor gesetzt habe?

habe auch das versucht aber ich kriege  es nicht
1
 
2
  do{
3
    cout<< "Bitte geben Sie ein:"<<endl;
4
    cout<< "Taste a: ändern"<<endl;
5
    cout<< "Tase  Enter : alte Wert von b behalten "<<endl;
6
    cin>> wahl;
7

8
   switch(wahl){
9
        
10
    case '\a': 
11
      cout<<"Wert für b eingeben:"<<endl; 
12
      cin>>b;
13
      cout<<"neue Wert von b ist "<<b<<endl;
14
      break;
15
      
16
      case '\x0d': 
17
    //case \x0d:           
18
      b=b;   
19
      cout<<"b="<<b<<endl;
20
      
21
      break;
22
      
23
    default : 
24
      cout<<"falche eingabe"<<endl;
25
    }   
26
  }while((wahl =='a')||(wahl== 'x0d' ));
OP #2301561
Lesenswert?
• ▲
▼
Sorry Dirk!

der reagiert  auf Esc taste  aber bei Enter -taste bleibt es hängen und 
zwar egal wie oft ich enter drüke und ich vermute dass ich mindenstes 
zwei mal enter-taste drücken muss .
1
  char wahl;
2
  int b=10;
3
  cout<<"b="<<b<<endl;
4
  
5
  do{
6
    cout<< "Bitte geben Sie ein:"<<endl;
7
    cout<< "Taste Esc : ändern"<<endl;
8
    cout<< "Tase  Enter : alte Wert von b behalten "<<endl;
9
    cin>> wahl;
10

11
   switch(wahl){
12
        
13
    case '\x01b': 
14
      cout<<"Wert für b eingeben:"<<endl; 
15
      cin>>b;
16
      cout<<"neue Wert von b ist "<<b<<endl;
17
      break;
18
      
19
      case '\x0d':           
20
      b=b;   
21
      cout<<"b="<<b<<endl;
22
      
23
      break;
24
      
25
    default : 
26
      cout<<"falche eingabe"<<endl;
27
    }   
28
  }while((wahl =='\x01b')||(wahl== '\x0d' ));
29
  
30
  return 0;
31
}
#2302091
Lesenswert?
• ▲
▼
Also mal langsam, so ein Terminal hat nun auch mal Modi und 
Einstellungen, die man ändern kann. Wenn man einzelne Zeichen statt 
ganze Zeilen als Eingabe erhalten will sollte man schon mal den 
Canonical Mode abschalten. Wenn man die automatische Ausgabe und 
sonstige automatische Verarbeitung von Eingabezeichen verhindern will, 
wäre der Raw Mode angebracht.

man termios, da steht das alles. Oder wie oben vorgeschlagen eine 
Library wie ncurses verwenden.

Und beim Rumbasteln passiert es garantiert, dass man die 
Terminaleinstellung mal nicht korrekt wiederherstellt beim Programmende, 
da ist das Kommando "reset" dein Freund. Notfalls blind eingetippt 
versetzt es das Terminal wieder in den Standardzustand.



Und noch was:

gerbej seb schrieb:
> ich möchte unter Linux (debian sarge, gcc) ein Konsolenprogramm
> schreiben.

Sarge? Das ist ja schon ne olle Kamelle, Debian ist aktuell drei 
Releases weiter. Sicherheitsaktualisierungen gibt es für sarge seit über 
3 Jahren nicht mehr.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren