cin.get()/cin.putback() <-- Was machen die
-
// istream putback #include <iostream> using namespace std; int main () { char c; int n; char str[256]; cout << "Enter a number or a word: "; c = cin.get(); if ( (c >= '0') && (c <= '9') ) { cin.putback (c); cin >> n; cout << "You have entered number " << n << endl; } else { cin.putback (c); cin >> str; cout << " You have entered word " << str << endl; } system("PAUSE"); return 0; }-Was machen die Befehle cin.putback(c) und cin.get(c) [bei cin.get habe ich die vermutung das das sowas ist wie std::cin^^ nur irgendwie einen Unterschied beim einlesen von den Daten macht, nur welcher das ist weiß ich nicht]
-Wieso muss ich beim ausführen des Programms bei der stelle "cin >> str" bzw "cin >> n" nichts über die Tastatur einlesen...(hängt das mit "cin.putback()" zusammen??)
-desweiteren verstehe ich (leider) auchnicht "if ( (c >= '0') && (c <= '9') )" wenn ich nämlich als eingabe '8' nehme, kommt immernoch... "you have entered number"...habe mich schon länger gefragt was diese beiden Befehle machen, bin aber zu keinem Ergebnis gekommen, auch die Site http://www.cplusplus.com/reference/iostream/istream/putback.html hat mir nicht weiter geholfen (daher habe ich auch das Beispiel)
Hoffe ihr könnt mir da weiter helfen...
Mfg Jud4s
PS: Wär schon toll wenn ihr mich auf einen Link verweisen könnt der mir Aufschluss gibt..
-
Netter Code:#include <iostream> int main () { int number; char string[256]; std::cout << "Enter a number or a word: "; const char first_char(std::cin.get()); // nächstes Zeichen aus dem Eingabestream (std::cin) einlesen. std::cin.putback(first_char); // zeichen wieder in den Eingabestream zurückschieben if ((first_char >= '0') && (first_char <= '9')) // gucken ob c eine Zahl ist ('0' ... '9') { std::cin >> number; // es ist eine nummer => integer einlesen std::cout << "You have entered number " << number << std::endl; } else { std::cin >> string; // es ist keine nummer => string einlesen std::cout << "You have entered word " << string << std::endl; } }Was machen die Befehle cin.putback(c) und cin.get(c)
- std::istream::get => Hole das erste Zeichen aus dem Eingabestream
- std::istream::putback => Packe das Zeichen an den Anfang des Eingabestreams-Wieso muss ich beim ausführen des Programms bei der stelle "cin >> str" bzw "cin >> n" nichts über die Tastatur einlesen...
Weil es sich bei std::istream um einenen gebufferten Eingabestream handelt. D.h. solange sich was im Streambuffer befindet, wird daraus gelesen
In deinem Fall steht da in jedem Fall was drin, da du per std::cin.putback ein Zeichen reingeschoben hast.
-
- std::istream::get => Hole das erste Zeichen aus dem Eingabestream
- std::istream::putback => Packe das Zeichen an den Anfang des Eingabestreamsheisst das dann nicht das man dann immer das selbe Zeichen einliest (wenn man z.b. 1+1 schreibt, wird ja die 1 ausgelesen..... dann wieder eingelesen...).
Und wenn man jezz kein putback befehl nimmt... aber erneut einen get.... wird dann das alte Zeichen das eingelesen wurde 'zerstört'?? das man quasie die Zeichenkette 1+1 als '1' - '+' - '1' einlesen und auswerten kann??PS: Könnted ihr mir vll ein Anfängerbuch für Cpp empfehlen?? Ein gutes wenn möglich
ich, habe bereits "Die Programmiersprache C++" von Bjarne Stroustrup, merke allerdings das es für mich Wochen dauert bis ich ein Kapitel 'verdaut' habe.....(ich habe bereits im Forumsverzeichnis nachgeguckt, dort aber viele Bücher gesehen und nun unsicher welches davon gut bzw nicht so gut ist... z.b. das Buch C++ für Dummies ((was ich auch habe)) wurde in einem anderen Forum als schlecht bis mieserabel bezeichnet, da man dort angeblich nur auf die C-Teile von C++ eingeht....
-
Jud4s schrieb:
Und wenn man jezz kein putback befehl nimmt... aber erneut einen get.... wird dann das alte Zeichen das eingelesen wurde 'zerstört'??
Nein. Das bis dahin aktuelle Zeichen kommt an die zweite Position des Streams, so daß du es beim übernächsten mal auslesen kannst.
Jud4s schrieb:
PS: Könnted ihr mir vll ein Anfängerbuch für Cpp empfehlen?? Ein gutes wenn möglich
ich, habe bereits "Die Programmiersprache C++" von Bjarne Stroustrup, merke allerdings das es für mich Wochen dauert bis ich ein Kapitel 'verdaut' habe.Der Stroustrup ist eine harte Nuß.
Ich würde dir "C++: Eine Einführung" von Ulrich Breymann, Hanser Verlag, empfehlen.
-
Es heißt einfach nur, das ein Zeichen durch putback an den Anfang des Streambuffers gesetzt wird. Beim nächsten Einlesen wird dann dieses mit eingelesen und somit aus dem Streambuffer wieder entfernt.
-
Nein. Das bis dahin aktuelle Zeichen kommt an die zweite Position des Streams, so daß du es beim übernächsten mal auslesen kannst.
heisst das dann bei '1' '+' wird dann beim putbackbefehl '+' '1' eingelesen????
Meintest du http://www.amazon.de/C%2B%2B-Eine-Einf%C3%BChrung-Ulrich-Breymann/dp/3446192336/ref=sr_1_3?ie=UTF8&s=books&qid=1205085597&sr=1-3???
-
Pass auf. Im Streambuffer steht jetzt (wahrscheinlich weil du es eingegeben hast
) z.B. "1+1=2". Durch das get, bekommst du das erste Zeichen => Im Buffer steht noch "+1=2". Mit putback kannst du jetzt ein Zeichen an den Anfang deines Streambuffers setzen. Wenn du z.B. std::cin.putback('9'); dann ausführen würdest, stünde im Streambuffer "9+1=2".
-
Mal angenommen im Stream stehen die Zeichen '1','2' und '3'
Wenn du ein Zeichen liest (die 3), dann Stehen im Stream nur noch die '1' und die '2'.
Rufst du nun putback ('4') auf, dann stehen im Stream: '1','2','4'.
Der nächsten cin.get()-Aufruf würde die '4' lesen, der übernächste die '2' und der letzte die '1'.
-
keyy... ist interressant....
gibt es Vorgaben was ich in was setzen darf?? Gibt der Compiler z.b. ein Fehler aus wenn ich in eine *char eine '9' einlesen will, oder in eine int ein 'c'??? Oder wird das dann zu einem laufzeitfehler??
-
Jud4s schrieb:
Meintest du http://www.amazon.de/C%2B%2B-Eine-Einf%C3%BChrung-Ulrich-Breymann/dp/3446192336/ref=sr_1_3?ie=UTF8&s=books&qid=1205085597&sr=1-3???
Genau das.

-
superb... dann weis ich ja was ich mir demnächst bestelle... vielen dank....^^
-
Jud4s schrieb:
gibt es Vorgaben was ich in was setzen darf?? Gibt der Compiler z.b. ein Fehler aus wenn ich in eine *char eine '9' einlesen will, oder in eine int ein 'c'??? Oder wird das dann zu einem laufzeitfehler??
Beide Funktionen arbeiten (nur) mit char, von daher ist die Frage hinfällig.
Es gibt allerdings die Beschränkung, dass das zurückgelegte Zeichen exakt das Zeichen sein muss, welches zuletzt gelesen wurde (27.5.2.2.4).
-
Jud4s schrieb:
keyy... ist interressant....
gibt es Vorgaben was ich in was setzen darf?? Gibt der Compiler z.b. ein Fehler aus wenn ich in eine *char eine '9' einlesen will, oder in eine int ein 'c'??? Oder wird das dann zu einem laufzeitfehler??
da '9' als zeichen eingelesen wird und nicht als zahl klappt das wunderbar.
wenn man ein nicht-numerisches zeichen in einen int einliest, wird normalerweise der ASCII-code für dieses zeichen in der variablen gespeichert.
also kein compiler-error, aber vielleicht ein bug / unvorhergesehenes verhalten des programms. und die meisten compiler geben wohl ein warning.