Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Eingaben
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>
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.
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ß
-= 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.
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
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 <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <errno.h>
/* 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)<0)||(tcgetattr(STDIN_FILENO,&newmode)<0));
/* install cleanup function */
ERROR_CHECK(atexit(cleanup)<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)<0);
tty=1;
}
/* while escaped has not been typed */
for (loop=1;loop;){
/* read a single character */
while (read(STDIN_FILENO,&ch,1)<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)<0);
break;
case ASCII_CTRL_E: /* turn on echo */
if (!tty) break;
newmode.c_lflag |= ECHO;
ERROR_CHECK(tcsetattr(STDIN_FILENO,TCSAFLUSH,&newmode)<0);
break;
default: /* own echo on stdout */
while (write(STDOUT_FILENO,&ch,1)<0) ERROR_CHECK(errno!=EINTR);
}
return EXIT_SUCCESS;
}
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,
_
// 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
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,
_
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.