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!


Anmelden zum Antworten