Ende einer do-while-Schleife per String-Vergleich



  • Guten Abend werte Community! 🙂

    Ich arbeite derzeit an einem umfangreichen Projekt, um mir das Leben ein wenig zu vereinfachn.

    Ein Teil des Programmes beinhaltet eine eigens programmierte Todo-Liste.
    Dort kann man selbstverständlich zu einer vorher selektierten Kategorie Todo-Einträge hinzufügen.

    Dies wird durch eine do-while-Schleife realisiert, die abgebrochen werden soll, sobald jemand nicht einen neuen Todo-Eintrag eingibt, sondern das word "stop".
    (Man kann also mehrere Einträge auf einmal zu einer Kategorie hinzufügen!)

    Das ist meine Funktion zur Hinzufügung von Todo-Einträgen:

    #include <iostream>
    #include <string>
    #include <windows.h>
    
    void newTodo()
    {
        system("title Todo-List: Input Todo Entry");
        system("cls");
    
        ifstream cats(catDirPath + "cats.txt");
    
        int i = 1;
        string catName;
        string allCats[100];
        while(cats >> catName)
        {
            cout << i << ". " << catName << endl;
            allCats[i] = catName;
            i++;
        }
    
        int catNumber;
        cout << "" << endl;
        cout << "Select category: ";
        cin >> catNumber;
    
        string selectedCat = allCats[catNumber] + ".txt";
        cats.close();
    
        ofstream newEntry(catDirPath + selectedCat, ios::app);
    
        string todo = "";
        do
        {
            cout << "Enter todo content" << endl;
            cin.ignore();   // ignores "enter"'s in buffer, so that getline() works and does not skip input
            getline(cin,todo);
    
            if (todo != "0")
                newEntry << todo << endl;
        } while(todo != "0");
    
        newEntry.close();
        start();
    }
    

    Gebe ich das Wort "stop" ein wird die Funktion nicht beendet wie gewollt. Gebe ich stattdessen Enter-Taste und dann "stop" ein, wird das Programm beenden, nur leider erfolgt ein Todo-Eintrag, der leer ist.

    Hoffe Ihr habt meine Ausführung verstanden und könnt mir helfen. 😉 😃

    Grüße. Train.


  • Mod

    Zeile 36 macht alles kaputt, die hat da nichts zu suchen. Du möchtest das ignore, wenn überhaupt, bloß ein einziges Mal zwischen einem operator>> und einem getline machen, aber niemals zwischen getlines. Hier also irgendwo vor der Schleife.

    Dein Kommentar, dass ignore Newlinezeichen überlesen würde, ist nämlich falsch. Es überliest ein Zeichen, egal welches. Und das getline lässt kein Newline im Stream. Hier hast du also durch die vielen ignores jede Menge gewünschte Zeichen fälschlicherweise verworfen.

    In aller Regel gilt übrigens, dass man in Leseschleifen zuerst liest, dann die Abbruchbedingung prüft und dann gegebenenfalls die gelesenen Daten verarbeitet. Bei dir ist das durcheinander, deswegen musst du die Bedingung unnötigerweise zwei Mal im Code haben. Eine korrekte Leseschleife ohne unnötige Wiederholungen sähe eher so aus:

    while(getline(cin,todo) && todo != "0")
    {
      newEntry << todo << endl;
    }
    


  • Vielen Dank Sepp3!

    Habe mir das von dir und mir angesehen und alles nochmal durchdacht. So wie du es formuliert hast, ist es einzig logisch.

    Schönn Abend noch!
    Train


Anmelden zum Antworten