Getline wird nicht beachtet



  • Hallo alle miteinander,
    ich habe ein Problem mit

    void ver()
    {
        string text;
        getline(cin, text);
        ofstream encode;
        encode.open("encode.txt");
        encode << text;
        encode.close();
        return;
    }
    

    dieser Passage. Sie wird über switch aufgerufen jedoch bei Ausführung kann ich nichts Eingeben, was ja eigentlich durch getline() geschehen sollte.
    Ich lerne C++11 mit einem Buch und habe versucht selbst ein kleines Programm zu schreiben, blieb jedoch an dieser Stelle hängen.
    Ich wäre sehr froh, wenn mich jemand auf meinen Fehler hinweisen würde, damit ich ihn beseitigen kann.
    Vielen Dank im vorraus. 🙂

    MFG JBHillmann



  • Haste vorher zufällig einen int eingelesen und das \n nach dem int hängt noch im Eingavepuffer rum?



  • Nein das kann nicht sein dies ist das erste das eingelesen wird...



  • Da ist so erstmal kein Fehler drin.
    Zeig mehr Code...

    Bzw: Step mal mim Debugger durch.



  • An dem Code fällt mir keine Fehler auf. Also ist er in einem anderen Programmteil, zum Beispiel beim Funktionsaufruf die Klammern vergessen. Müßtest den Rest des Programms auch zeigen. Optimalerweise so, daß wir es einfach auf dem eigenen Rechner ausprobieren können, also ein kleines aber vollständiges Programm.



  • Hier ist der code der bis zu dieser stelle verwendet wird...
    Sonstige Verbesserungsvorschläge auch gerne erwünscht 🙂

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    void rig();
    void start();
    void ver();
    void ent();
    void bad();
    void ende();
    
    bool sv1{1}, sv2{1};
    
    int main()
    {
        if (::sv2)
        {
            rig();
        }
        if (::sv1)
        {
        start();
        }
        return 0;
    }
    
    void rig()
    {
        cout << "Krypto \n VERSION 1.3\n ENGLISH \n ALL RIGHTS RESERVED BY JBD \n";
        sv2=0;
        return;
    }
    
    void start()
    {
        cout << "\n [A] Text encoding";
        cout << "\n [B] Text decoding";
        cout << "\n [E] End";
        cout << "\n \n Your input: ";
        char want{0};
        cin >> want;
        switch (want)
        {
            case 'A': ver(); break;
            case 'a': ver(); break;
            case 'B': ent(); break;
            case 'b': ent(); break;
            case 'E': ende(); break;
            case 'e': ende(); break;
            default: bad();
        }
        main();
    }
    
    void ver()
    {
        string text;
        getline(cin, text);
        ofstream encode;
        encode.open("encode.txt");
        encode << text;
        encode.close();
        return;
    }
    


  • volkard schrieb:

    Haste vorher zufällig einen int eingelesen und das \n nach dem int hängt noch im Eingavepuffer rum?

    JBHillmann schrieb:

    Nein das kann nicht sein dies ist das erste das eingelesen wird...

    JBHillmann schrieb:

    cin >> want;

    Zwar kein int sondern ein char, hat aber den gleichen Effekt.

    Sonstige Verbesserungswünsche: Lass die globalen Variablen raus, ruf main nicht rekursiv auf.



  • patrick246 schrieb:

    Sonstige Verbesserungswünsche: Lass die globalen Variablen raus, ruf main nicht rekursiv auf.

    main rekursiv aufzurufen ist nicht einmal erlaubt.



  • JBHillmann schrieb:

    Sonstige Verbesserungsvorschläge auch gerne erwünscht 🙂

    Dieses Buch schnell wegwerfen! Das ist kein C++, sondern irgendwas anderes. Erinnert an Wolf.



  • Ok danke und wie kann ich das beheben?
    Was bedeutet

    patrick246 schrieb:

    ruf main nicht rekursiv auf.

    ?

    Ist tatsächlich das Buch von Jürgen WOlf 😞



  • JBHillmann schrieb:

    Ok danke und wie kann ich das beheben?
    Was bedeutet

    patrick246 schrieb:

    ruf main nicht rekursiv auf.

    ?

    Schreib nicht main() als Funktionsaufruf.



  • Ahh ok danke
    werd ich ändern
    und was ist jetzt mit dem eigentlichen Problem? wie bekomm ich das \n
    das im Eingabepuffer gammelt weg?





  • #include <limits>
    
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // verwirf max() Zeichen, bis du auf newline oder EOF stößt
    


  • #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    //Vorwärtsdeklarationen sind eigentlich nicht nötig. Sinnlos viel Arbeit. 
    //Schlechte Namen, als Leser erkenne ich nicht, was die machen. 
    void rig();
    void start();
    void ver();
    void ent();
    void bad();
    void ende();
    
    //Uniforme Initialisierung ist hier fürn Popo. 
    //Und bools mit 1 initialisieren? true!!!
    //Das ist ja C und kein C++. 
    //sv? Sagt mir nix. 
    bool sv1{1}, sv2{1};
    
    int main()
    {
        if (::sv2)
        {
            rig();
        }
        if (::sv1)
        {
        start();
        }
        return 0;//darf man weglassen
    }
    
    void rig()
    {
        cout << "Krypto \n VERSION 1.3\n ENGLISH \n ALL RIGHTS RESERVED BY JBD \n";//\n am ENDE
        sv2=0;//false
        return;//störend
    }
    
    void start()
    {
        cout << "\n [A] Text encoding";//\n am ANFANG, inkonsistent.
        cout << "\n [B] Text decoding";
        cout << "\n [E] End";
        cout << "\n \n Your input: ";
        char want{0};//Wozu auf 0 setzen? Warum die häßliche {}-Syntax? 
        cin >> want;
        switch (want)
        {
            case 'A': ver(); break;
            case 'a': ver(); break;
            case 'B': ent(); break;
            case 'b': ent(); break;
            case 'E': case 'e': ende(); break;//oder einfach so:
            default: bad();
        }
        main();//verboten!
    }
    
    void ver()
    {
        string text;//später
        getline(cin, text);
        ofstream encode;//konstuktor
        encode.open("encode.txt");//konstruktor!
        encode << text;
        encode.close();//DESTRUKTOR!!!
        return;//sinnlos
    }
    


  • Ok Problem gelöst funktioniert nun 🙂
    Vielen Dank an euch
    und wiedermal sehe ich wie ich als Anfänger extrem viel zu lernen habe und das hier dinge kritisiert werden die ich meinem "Lernbuch" gleichtue...
    Soll ich anstant Vorwärtsdeklarationen zu machen die main() ans Ende setzen?



  • JBHillmann schrieb:

    Soll ich anstant Vorwärtsdeklarationen zu machen die main() ans Ende setzen?

    Ja.
    Und FALLS doch mal eine gebrauch werden würde, kannste immernoch eine machen.

    Hier wird sie gebraucht, weil sich Funktionen gegenseitig aufrufen. Aber der main()-Trick ist eh nicht gut.



  • Problem: Die start() gibt keinen bool zurück!

    Gute Lösung:

    int main()
    {
       cout << "Krypto \n VERSION 1.3\n ENGLISH \n ALL RIGHTS RESERVED BY JBD \n";
       while(start())
    	   ;
    }
    

    Seine start() gibt nix zurück, aber genau dort kann er nur feststellen, ob der Benutzer aufhören will. Also ruft der Auto die main() auf. Mit dem Problem, daß der Into-Text immer kommt und nicht nur einmal, also legt er globale Variablen an und schreibt

    if (::sv2)
        {
            rig();
        }
    

    Wie schrecklich. Und abgesehen von allen Dummheiten steckt einfach in jedem Detail Mist. Zum Beispiel hätte es sein sollen

    if (sv2)
        {
            rig();
    	sv2=false;
        }
    

    dann sieht man hier, was das bedeuten soll: Nur einmal anzeigen. Die Zuweisung wegzuverstecken hilft doch genau gar keinem. Ich bin mit dem Code runherum nicht einverstanden.



  • volkard schrieb:

    ofstream encode;//konstuktor
        encode.open("encode.txt");//konstruktor!
        encode << text;
        encode.close();//DESTRUKTOR!!!
        return;//sinnlos
    }
    

    und warum regt man sich hier über encode.close(); auf?



  • JBHillmann schrieb:

    und warum regt man sich hier über encode.close(); auf?

    Weil Du später Code schreiben wirst, der überall Exceptions werfen könnte, und da bringt close() nichts mehr. Also wozu erst angewöhnen?


Log in to reply