Thread View: de.comp.lang.c++
3 messages
3 total messages
Started by Ronald Woelfel
Thu, 04 Apr 1996 20:50
alternative zu getch ?
Author: Ronald Woelfel
Date: Thu, 04 Apr 1996 20:50
Date: Thu, 04 Apr 1996 20:50
13 lines
800 bytes
800 bytes
Weiss jemand ne Moeglichkeit ein Zeichen in C einzuloesen
ohne dass ein Enter erforderlich ist. Die Loesung soll
auch unter Unix funktionieren, also getch is nicht.
Danke im voraus
Ronny
--
-------------------------------------------------------
Email: l045@felix.hrz.uni-giessen.de
Phone: +49 661 241044 or +49 921 56357
Smail: Ronald Woelfel, Lenbachstr. 21, D-95447 Bayreuth
Re: alternative zu getch ?
Author: Dietmar Kuehl
Date: Mon, 08 Apr 1996 14:35
Date: Mon, 08 Apr 1996 14:35
65 lines
2302 bytes
2302 bytes
Hi,
Ronald Woelfel (l045@felix.hrz.uni-giessen.de) wrote:
: Weiss jemand ne Moeglichkeit ein Zeichen in C einzuloesen
: ohne dass ein Enter erforderlich ist. Die Loesung soll
: auch unter Unix funktionieren, also getch is nicht.
Fuer diese Problem gibt es weder in C noch in C++ eine portable
Loesung. Wenn man sich auf POSIX beschraenkt (das wird von den meisten
UNIX Varianten und von den meisten C Libraries unter PC-Systemen
unterstuetzt), dann kann man es hinbekommen, indem man das Terminal
(tty) in den "non-canonical mode" schaltet:
#include <iostream.h>
#include <termios.h>
int main()
{
int line = 0;
for (int i = 0; i < 100; i++)
{
cout << i << endl;
if (line++ >= 23)
{
char dummy = 0;
cout << "press any key to continue" << endl;
struct termios term;
struct termios save;
if (tcgetattr(0, &save) < 0)
return -1;
term = save;
term.c_lflag &= ~(ECHO | ICANON);
term.c_cc[VMIN] = 1;
term.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSAFLUSH, &term) < 0)
return -1;
cin && (cin.get(dummy));
if (tcsetattr(0, TCSAFLUSH, &save) < 0)
return -1;
line = 0;
}
}
return 0;
}
Dieser Code ist uebrigens eigentlich auch "environment specific": Er
funktioniert nur auf Platformen, die POSIX unterstuetzen. Das sind aber
recht viele.
Man sollte die Funktionen, die das tty umschalten noch in Klassen
einpacken und als "Resource" ansehen: man muss unbedingt die Resource
wieder freigeben (in diesem Fall das tty wieder in seinen
urspruenglichen Zustand bringen), da sich sonst andere Programme (z.B.
die Shell) nicht richtig verhalten.
--
dietmar.kuehl@uni-konstanz.de
http://www.informatik.uni-konstanz.de/~kuehl/
I am a realistic optimist - that's why I appear to be slightly pessimistic
Re: alternative zu getch ?
Author: Erik Thiele
Date: Tue, 09 Apr 1996 08:35
Date: Tue, 09 Apr 1996 08:35
89 lines
2699 bytes
2699 bytes
In article <4k1cmh$fnp@c4.hrz.uni-giessen.de>,
l045@felix.hrz.uni-giessen.de (Ronald Woelfel) writes:
>Weiss jemand ne Moeglichkeit ein Zeichen in C einzuloesen
>ohne dass ein Enter erforderlich ist. Die Loesung soll
>auch unter Unix funktionieren, also getch is nicht.
>Danke im voraus
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <termios.h>
/***************************************************
Gibt 0 zurueck, falls keine Taste gedrueckt wurde,
ansonsten Ergebnis ungleich 0.
***************************************************/
int kbhit()
{
fd_set a;
FD_ZERO(&a);
FD_SET(0,&a);
timeval t;
t.tv_usec=0;
t.tv_sec=0;
return(select(1,&a,NULL,NULL,&t));
};
/***************************************************
Gibt ein Byte aus STDIN zurueck.
Falls keines vorhanden ist, wird unendlich lang
gewartet, bis eins vorhanden ist.
***************************************************/
char getch()
{
char a;
read(0,&a,1);
return(a);
};
int main()
{
// ** Initialisierung des Terminals in den Kanonenmodus :-)
termios a;
if (tcgetattr ( 0, &a )) perror("FUCK !");
a.c_lflag&=~ICANON;
if (tcsetattr (0,TCSANOW,&a)) perror("FUCK2 !");
while (!kbhit()) {
printf("Warte immernoch auf Tastendruck\n");
usleep(500);
};
char b;
read(0,&b,1);
printf(" You pressed the glourious %c key :-) \n ",b);
// ** Deinitialisierung des Terminals in den Normalmodus :-(
if (tcgetattr ( 0, &a )) perror("FUCK3 !");
a.c_lflag|=ICANON;
if (tcsetattr (0,TCSANOW,&a)) perror("FUCK4 !");
return(0);
};
Du musst das Terminal erst in den ICANON modus schalten. sonst schickt es
seine Daten erst beim Druck auf Enter. im ICANON modus hingegen kommt byte
fuer byte an.
ob in einem stream was vorhanden ist fragt man mit select ab.
das ganze laeuft auf gcc 2.7.0 mit linux 1.2.13
tschuesss...
Erik
--
EMAIL: erik@master.unterland.de \\\\
IRC: erikyyy o `QQ'_
/ __8
' `
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads