🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #2037

Re: alternative zu getch ?

#2037
From: 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
Technical Details
Message-ID: <4kb88e$ll6@news.BelWue.DE>
Path: arc1-ca.pugleaf.net!news.belwue.de!uzwil!kuehl
References: <4k1cmh$fnp@c4.hrz.uni-giessen.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.belwue.de!uzwil!kuehl
From: kuehl@uzwil.informatik.uni-konstanz.de (Dietmar Kuehl)
Newsgroups: de.comp.lang.c++
Subject: Re: alternative zu getch ?
Date: 8 Apr 1996 14:35:58 GMT
Organization: Fakultät für Mathematik und Informatik
Message-ID: <4kb88e$ll6@news.BelWue.DE>
References: <4k1cmh$fnp@c4.hrz.uni-giessen.de>
Reply-To: dietmar.kuehl@uni-konstanz.de
NNTP-Posting-Host: uzwil.informatik.uni-konstanz.de
X-Newsreader: TIN [version 1.2 PL2]