tastatureingabe mit Strg+D beenden
-
Die Eingabe soll auf Strg+D (EOF) enden. Das passiert aber mit folgendem Codeschnippsel nicht. Nach Strg+D werden alle Zeichen Zeichen ausgegeben und es wird munter auf weiteren Input gewartet. Wieso?
char ch; while ((ch = cin.get()) != EOF) { cout << ch; }
-
Die EOF-Rückgabe funktioniert nur für C "Streams" (FILE*). C++ IOStreams setzen bei Fehlern einzelne Error-Flags, die du abfragen kannst.
(außerdem liegt EOF außerhalb des Wertebereichse von char, so daß er bei der Zuweisung schon zusammengestutzt wird)Versuch's mal so:
char ch; /* diese Version von get liefert den Stream selber zurück - und der wird nach false umgewandelt, wenn ein Eingabefehler (inklusive EoF) aufgetreten ist */ while(cin.get(ch)) mach was
-
cin.get() gibt auch ein EOF zurück - aber das ist ein anderes als das von C (std::istream::traits_type::eof()), auch wenn es denselben Wert haben könnte. Dass der char, an den Du zuweist, zu klein für EOF ist hat ja CStoll bereits gesagt.
-
einfachste Lösung:
int ch;
Dass std::foobar::eof() gleich EOF ist, ist sicher kein Zufall.
-
ok, char und EOF passt nicht wirklich
der Vorschlag von CStoll dürfte doch eigentlich nicht funktionieren, denn um die Schleife zu verlassen müsste get() ja 0 zurückgeben. EOF ist doch "meist" -1?
Ich habe jetzt mal meinen ersten Codeschnippsel auf "int ch" geändert.
Wenn die Eingabeaufforderung kommt und ich drücke gleich "Strg+D" beendet er.Wenn ich aber was eingebe und dann Strg+D drücke, wie z.B. aaa'Strg+D' gibt er drei mal "97" aus und wartet weiter auf Eingabe. Wenn ich dann nochmal Strg+D drücke, dann gehts erst weiter! Aber 2x "Strg+D" drücken kann es doch nicht sein.
hier nochmal der Code:
int ch; while ((ch = cin.get()) != EOF) { cout << endl << ch; }
-
grandpa schrieb:
der Vorschlag von CStoll dürfte doch eigentlich nicht funktionieren, denn um die Schleife zu verlassen müsste get() ja 0 zurückgeben. EOF ist doch "meist" -1?
Nein, get() (in dieser Version) liefert nicht 0 oder -1 zurück, sondern cin. Aber cin kann implizit in einen bool umgewandelt werden (eigentlich void*, aber den kann C++ als bool verwenden) - und diese Umwandlung liefert falsch, wenn irgendein Fehler bei den letzten Eingaben aufgetreten ist.
Ich habe jetzt mal meinen ersten Codeschnippsel auf "int ch" geändert.
Wenn die Eingabeaufforderung kommt und ich drücke gleich "Strg+D" beendet er.Wenn ich aber was eingebe und dann Strg+D drücke, wie z.B. aaa'Strg+D' gibt er drei mal "97" aus und wartet weiter auf Eingabe. Wenn ich dann nochmal Strg+D drücke, dann gehts erst weiter! Aber 2x "Strg+D" drücken kann es doch nicht sein.
Ich würde mal vermuten, daß dir dort die Zeilenpufferung von cin in die Quere gekommen ist.
-
Ich würde mal vermuten, daß dir dort die Zeilenpufferung von cin in die Quere gekommen ist.
kann man das irgendwie "ausstellen"?
Ich habe dann auch mal den Vorschlag von CStoll probiert.
Scheint das gleiche zu sein. Die '^D' werden auch so ausgegeben wo ich "Strg+D" gedrückt habe.Ein und Ausgabe:
>./test abc^D // Eingabe a b c^D // wartet hier, nochmal "Strg+D" gedrueckt ende
char ch; while(cin.get(ch)) { cout << endl << ch; } cout << endl << "ende" << endl;
-
CStoll schrieb:
Wenn ich aber was eingebe und dann Strg+D drücke, wie z.B. aaa'Strg+D' gibt er drei mal "97" aus und wartet weiter auf Eingabe. Wenn ich dann nochmal Strg+D drücke, dann gehts erst weiter! Aber 2x "Strg+D" drücken kann es doch nicht sein.
Ich würde mal vermuten, daß dir dort die Zeilenpufferung von cin in die Quere gekommen ist.
Nein, cin hat damit nichts zu tun. Das ist das übliche Verhalten des Terminals. ^D bewirkt, dass read() sofort zurückkehrt. EOF ist, wenn read() null Zeichen liest, also 0 zurückgibt. Das kann nur passieren, wenn man ^D am Anfang der Zeile drückt.
Ach ja, wer's noch nicht gemerkt hat, das ist Unix-Spezifisch. Unter anderen Systemen funktioniert ^D wahrscheinlich anders oder gar nicht.
-
ja genau, unter Windows müsste man glaube Strg+Z statt Strg+D drücken.
Wenn der Input von einer Datei (mit Umleitungsoperator) kommt, dann funzen die Beispiel wunderbar:
>echo abc > input >cat input abc >./test < input a b c ende
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.