C++-Äquivalent für getch()
-
also wenn es dir nur darum geht, dass es kein echo gibt, koennte das gehen, indem du die kopplung zwischen cin und cout kaputt machst (weiss jetzt nicht, wie das geht, wurde aber schonmal diskutiert). reagiert wird aber trotzdem erst bei enter.
vielleicht waeren die streams zu ineffizient, wenn sie fuer jedes einzelne zeichen einen callback ausloesen muessten oder so. obwohl man ruhig einen speziellen tastaturinputstream haette machen koennen, den man ja nicht nutzen muesste, wenn es um effizienz geht.
das return 0; ergaenzt laut standard der compiler, du solltest nicht den vc6 zum mass aller dinge erheben. warum ausserdem 0L statt 0? steht das L nicht fuer long, waehrend ohne was int ist?
-
Lassen wir den äußeren Rahmen mal weg. So interessant ist der wirklich nicht.
Es könnte doch z.B. eine Funktion cin.getch() (o.ä.) geben, die derjenigen von getch() in conio.h entspricht, wenn das mit der Echo-Unterdrückung so gehen würde.
HumeSikkins hat einen Code mit getch() gleich aus dem C++-Forum verbannt!
Nun wüßte ich gerne die unter C++-Standard-Freaks "geachtete" Alternative.Nur so eine Idee: Vielleicht ist
c = cin.peek();
eine Möglichkeit. Mit
if ( (c == 'Z') ... )
könnte man dann z.B. auf 'Z' abfragen. Man müsste dann nur noch cin und cout entkoppeln (Echounterdrückung) und den istream nach dem peek() (ohne Eingabe von Enter) leeren. Ist aber alles viel komplizierter als getch().
[ Dieser Beitrag wurde am 07.07.2003 um 04:18 Uhr von Erhard Henkes editiert. ]
-
wie oft denn noch: die gibt es nicht.
-
Ich kann es einfach nicht akzeptieren, dass man conio.h für so einfache Aufgaben benötigt.
-
es geht hier nicht um konsole, erhard, sondern um den c++ standard.
und dem standard ist ein und ausgabe relativ egal.
wenn du als api-programmierer gerne die konsole funktional haben möchtest, schau ins konsolenforum, da gibt es im faq viele schöne möglichkeiten - für alle windows-arten und compiler.hier wird eine ganz andere ebene diskutiert, nämlich was im standard festgeklopft wird.
und an das sich eigentlich alle compiler halten sollten (auch wenn das visual studio es immer anders macht, wir leben damit. ich rate dir jedoch zu einem compilerwechsel, oder mach es wie ich, 5 compiler nebeneinander fahren.)was gibts da nicht zu akzeptieren? das hat nix mit deiner konsole zu tun.
als ob die diskussionen der letzten zwei jahre im c++ standard forum an dir vorbeigehuscht sind.
[ Dieser Beitrag wurde am 07.07.2003 um 07:10 Uhr von elise editiert. ]
-
dem standard ist ein und ausgabe relativ egal
5 compiler nebeneinander fahrenInteressant.
Wenn ich herausgefunden habe, wie man getch() in akzeptiertem C++ simuliert, werde ich es posten.
-
Das wirst du nicht schaffen. Unmöglich!
-
Hallo,
der Denkfehler setzt bereits ganz oben an: Weder in ANSI-C noch in ANSI-C++ kann man von der Tastatur lesen. Man liest von der Standardeingabe, welche an einen Eingabestrom gekoppelt ist. In der Regel liest der entsprechende Eingabestrom seine Zeichen von der Tastatur. Standard-C++ an sich kennt aber weder Tastaturen noch Drucker oder sonst irgendwelche *physischen* Eingabegeräte.
Du hast deine Strom-Abstraktion. Woher die aber ihre Zeichen bekommt ist nicht festgelegt.Also:
cin und co repräsentieren nicht direkt ein physisches Gerät. Sie lesen Zeichen aus einem Strom und formatieren diese wenn nötig. Der Strom wiederum erhält (bzw. schreibt in) seine Zeichen von einem Streambuffer. Streambuffer sind also eine Abstraktion wirklicher Zeichenquellen (-senken).Der entscheidene Punkt ist, dass nirgends festgelegt ist, wie und woher ein Streampuffer seine Zeichen bekommt.
Natürlich könnte man sich eine Implementation eines Streampuffers vorstellen, der seine Zeichen Zeichen-für-Zeichen von einer Tastatur liest, Standard-C++ schreibt eine solche Implementtion aber natürlich nicht vor.
-
@Erhard Henkes:
Du arbeitest anscheinend mit Windows. Also mal ein Win-Spezifisches Beispiel. Was ist, wenn ich dein Programm so starte:
C:\>programm < datei.txt
Nun ist cin und auch stdin nicht mehr die Tastatur, sondern datei.txt. Was passiert jetzt.
Wenn du die conio.h nicht magst verwende doch irgendeine andere Lib, die mit der Tastatur umgehen kann. SDL bietet solche funktionen beispielsweise und ist für viele PC und MAC Betriebssystem erhältlich.
-
stdio includieren und getchar() verwenden