PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Eingaben



JRausi
11-06-2001, 18:28
Hallo!

Ich als Pascal-Umsteiger auf C/C++ hab da noch ein paar Probleme mit manchen
Befehlen.
'cout' nehme ich um Ausgaben auf den Bildschirm zu bringen.
'cin' um Eingaben DIE MIT <ENTER> ABGESCHLOSSEN WERDEN MÜSSEN.
... und genau da ist das Problem: Wie kann ich Tastatureingaben
kontrollieren/abfangen ohne das man erst <ENTER> drücken muß??? :confused:
(Bei Pascal gab's da den Befehl 'readkey' bzw. auch 'keypressed'.)

Danke für Eure Hilfe


Tschö
Jörg
<joerg.rausendorf@epost.de>

mxxx
11-06-2001, 23:49
unter Linux kann das schwer werden...
unter Windows gibts conio.h
also:
#include <conio.h>
//...
char key = getch();

aber unter Linux gibts kein conio.h file.
ich werde hier mal n source für ne nachprogrammierte conio.h file reintun.. hab etwas gedult. Allerdings kann dann nur der
Supteruser (root) solche Programme ausführen.

Pingu
12-06-2001, 09:54
Hi,

schon mal voraus unter Linux hab ich noch nie programmiert, aber

probier doch mal 'getchar()' anstatt von 'getch()'. denn 'getchar()' ist eine standard ANSI-C funktion aus 'stdio.h' und sollte somit theoretisch auch von linux unterstützt werden.

Gruß

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-= Pingu =-

PS: Ein sehr gute Hilfe für mich ist die Hilfe von Borland C++. Da steht nämlich bei jeder Funktion die Portabilität dazu.

thommy
12-06-2001, 11:38
In der Standardeinstellung arbeiten Ein- und Ausgabe gepuffert, d.h. getc (getch, getchar) kehren erst zurück, wenn die Eingabe mit einem [Return] abgeschlossen wird.

Die Pufferung kann u.a. mit cbreak bzw. nocbreak ab- bzw. angeschalten werden. Diese Funktionen sind in curses.h enthalten.

Thomas

mxxx
13-06-2001, 19:37
Kannst du dann mal die Funktion getch()
nachprogrammieren? Also sie liest genau ein
Zeichen von der Tastatur, ohne es mit RETURN
zu beenden!

jgbauman
13-06-2001, 21:26
Das war mal ne Uebungsaufgabe zu dem Thema.
Sollte als Grundlage (mit passendem man-page Studium) reichen. Viel Spass damit ;-)

#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;unistd.h&gt;
#include &lt;termios.h&gt;
#include &lt;errno.h&gt;

/* define keycodes according to extended ASCII */
#define ASCII_ESC 27
#define ASCII_CTRL_E 5
#define ASCII_CTRL_N 14

/* shortcut for simple system/library-call error checking */
#define ERROR_CHECK(error_condition)\
if (error_condition){\
perror("type");\
exit(EXIT_FAILURE);\
}
/* terminal modes */
struct termios oldmode;
struct termios newmode;

/* restore previous terminal mode */
void cleanup(){
tcsetattr(STDIN_FILENO,TCSAFLUSH,&oldmode);
}

/* someone has to do the main work :-) */
int main(int argc,char * argv[]){
char ch;
int loop;
int tty=0;

/* do we have a terminal to manipulate? */
if (isatty(STDIN_FILENO)==1){
/* save old mode */
ERROR_CHECK((tcgetattr(STDIN_FILENO,&oldmode)&lt;0)&#0124;&#0124;(tcgetattr(STDIN_FILENO,&newmode)<0));

/* install cleanup function */
ERROR_CHECK(atexit(cleanup)&lt;0);

/* set noncanonical,signal ignoring,one char returning terminal mode */
newmode.c_lflag &= ~(ICANON|ISIG);
newmode.c_cc[VMIN] = 1;
newmode.c_cc[VTIME] = 0;
ERROR_CHECK(tcsetattr(STDIN_FILENO,TCSAFLUSH,&newmode)&lt;0);
tty=1;
}
/* while escaped has not been typed */
for (loop=1;loop;){
/* read a single character */
while (read(STDIN_FILENO,&ch,1)&lt;0) ERROR_CHECK(errno!=EINTR);
switch (ch){
case ASCII_ESC: /* exit */
loop=0;
break;
case ASCII_CTRL_N: /* turn off echo */
if (!tty) break;
newmode.c_lflag &= ~ECHO;
ERROR_CHECK(tcsetattr(STDIN_FILENO,TCSAFLUSH,&newmode)&lt;0);
break;
case ASCII_CTRL_E: /* turn on echo */
if (!tty) break;
newmode.c_lflag |= ECHO;
ERROR_CHECK(tcsetattr(STDIN_FILENO,TCSAFLUSH,&newmode)&lt;0);
break;
default: /* own echo on stdout */
while (write(STDOUT_FILENO,&ch,1)&lt;0) ERROR_CHECK(errno!=EINTR);
}
return EXIT_SUCCESS;
}

Benngun
08-03-2002, 14:40
Original geschrieben von thommy
In der Standardeinstellung arbeiten Ein- und Ausgabe gepuffert, d.h. getc (getch, getchar) kehren erst zurück, wenn die Eingabe mit einem [Return] abgeschlossen wird.

Die Pufferung kann u.a. mit cbreak bzw. nocbreak ab- bzw. angeschalten werden. Diese Funktionen sind in curses.h enthalten.

Thomas
ich muß das Thema nochmal auffrischen: das einbinden der curses.h Klappt, aber der Linker kommt mit dem Ganzennicht klar, er kann die funktionen cbreak() und nocbreak() nicht auflösen :( in was für ner lib oder was für ner .o File kann man die funktionen suchen lassen?

anda_skoa
08-03-2002, 14:57
Wie sieht dein Linkeraufruf aus?

#> gcc -o meinprog meinsource.o -L/usr/lib -lcurses

Sollte gehen.

Ciao,
_

rup
08-03-2002, 17:03
// EinzelnesZeichen.cpp

#include<curses.h>
#include<iostream>

int main()
{
int c;

// Terminaltyp bestimmen
initscr();

// Zeichen sofort ausgeben ohne Enter
raw();

// Zeichen lesen
c=getch();

// Terminal wieder zuruecksetzen
endwin();

// Zeichen schreiben
cout.put(c);
}

Kompilieren mit:
g++ -lncurses EinzelnesZeichen.cpp -o EinzelnesZeichen

Gruss Rupert

Benngun
19-03-2002, 16:49
War ne weile weg, drum erst jetzt wieder ne Antwort:

ich bin aber immer noch nicht weiter


gcc -o meinprog meinsource.o -L/usr/lib -lcurses
tut es zwar aber die eingabe muß trotzdem noch mit <Enter> abgeschloßen werden damit was passiert.

und die zweite möglichkeit von rup tut es leider auch nicht da die bibilotek ncurses nicht gefunden wird :(

vieleicht noch als Hinweis: ich versuch das ganze auf nem SINIX Hobel

anda_skoa
19-03-2002, 17:39
AFAIK ist ncurses nur eine neuere Version von curses, evenuell mit ein paar Erweiterungen.

Versuch rups Beispiel mit curses zu linken.

Ciao,
_