🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.lang.c++
3 messages
3 total messages Started by Ronald Woelfel Thu, 04 Apr 1996 20:50
alternative zu getch ?
#2009
Author: Ronald Woelfel
Date: Thu, 04 Apr 1996 20:50
13 lines
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 ?
#2037
Author: Dietmar Kuehl
Date: Mon, 08 Apr 1996 14:35
65 lines
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 ?
#2055
Author: Erik Thiele
Date: Tue, 09 Apr 1996 08:35
89 lines
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