Problem mit getline/seekg/clear
-
Hallo , Ich habe ein Problem mit den 3 genannten Aufrufen.
Und zwar soll erst über cin.getline eingelesen werden , die Zeichen die "zuviel" vorhanden sind, sollen eben per cin.seekg & cin.clear gelöscht werden , da Sie sonst die folgenden getline Aufrufe ins Jenseits schicken!nun mein problem , dazu vllt erstmal der code .. nicht erschrecken..
cin.seekg(0,ios::end); cin.clear(); system("cls"); cout<<"Geburtsjahr des Studenten: "<<flush; cin.getline(gj,5); if(gj[0] == '0') {break;} cin.seekg(0,ios::end); cin.clear(); cout<<"Vorname des Studenten: "<<flush; cin.seekg(0,ios::end); cin.clear(); cin.seekg(0,ios::end); cin.clear(); cin.getline(vor,20); cin.seekg(0,ios::end); cin.clear(); cin.seekg(0,ios::end); cin.clear(); cout<<"Nachname des Studenten: "<<flush; cin.getline(nach,20); cin.seekg(0,ios::end); cin.clear(); cin.seekg(0,ios::end); cin.clear();Nun zu meinem Problem bzw meiner Frage..
Warum zur Hölle "muss" ich seekg/clear so oft aufrufen? Tu ichs nicht - löscht er nicht korrekt und geht trotzdem in die folgenden Aufrufe und schreibt das Ende der vorherigen Eingabe rein
Und das Zweite: Gibt es eine andere (hübschere..) Möglichkeit sicherzustellen dass die Eingabe nicht die max. Zeichenlänge überschreitet?
Hoffe dasses nicht zu verwirrend ist , is ja schon früh/spät :x
-
Eigentlich nimmt man dafür cin.clear() und danach ein cin.ignore(...).
Wenn du darfst würde ich an deiner Stelle aber auf jeden Fall std::string und std::getline verwenden, da brauchst du sowas nämlich gar nicht.
std::string input; std::getline(std::cin, input); std::cout << input << std::endl;
-
wenn ich cin.ignore(); dann muss ich aber z.B 2x return drücken um zur nächsten eingabe zu kommen und manche nimmt er net richtig auf oO
und das 2te macht er irgendwie net Oo
-
hast du visual c++ 6? da gabs irgendwie einen bug in getline, keine ahnung ob das was mit deinem problem zu tun hat. hier gibts nen bugfix: http://fara.cs.uni-potsdam.de/~kaufmann/?page=Programming&ProgKNr=1#Code
-
ne , dev-cpp
-
poste mal ein minimales programm das wo das problem zu sehen ist. (mit main-funktion)
-
#include <iostream> #include <fstream> #include <iomanip> #include <string> using namespace std; int main (void) { char vor[20]; char nach[20]; char gj[5]; char nr[7]; cout<<"Geburtsjahr des Studenten(0=>Hauptmenu): "<<flush; cin.getline(gj,5); cin.seekg(0,ios::end); cin.clear(); cout<<"Vorname des Studenten: "<<flush; cin.seekg(0,ios::end); cin.clear(); cin.seekg(0,ios::end); cin.clear(); cin.seekg(0,ios::end); cin.clear(); cin.seekg(0,ios::end); cin.clear(); cout<<"Nachname des Studenten: "<<flush; cin.getline(nach,20); cin.seekg(0,ios::end); cin.clear(); cin.seekg(0,ios::end); cin.clear(); cout << vor << " " << nach << " " << gj << endl; }habs mal so copy pasted , müsst reichen
-
#include <iostream> #include <string> using namespace std; int main() { string geburtsjahr; cout << "Geburtsjahr des Studenten: "; getline(std::cin, geburtsjahr); string vorname; cout<< "Vorname des Studenten: "; getline(std::cin, vorname); string nachname; cout<< "Nachname des Studenten: "; getline(std::cin, nachname); cout << geburtsjahr << " " << vorname << " " << nachname << "\n"; }
-
das läuft , nur is es dann ja möglich ne jahreszahl mit zb 20 stellen einzugeben,
und genau das möchte ich ja unterbinden!
-
Dann überprüf die Eingabe.
if(geburtsjahr.length() > 4) { // Fehlerbehandlung }
-
so simpel und ich komm nicht drauf -.-!
danke!