Übungsaufgabe



  • Hallo liebe Community,

    ich habe folgendes Problem, Ich versuch C++ zu lernen mit dem Buch "C++ eine Einführung" von Ulrich Breymann,
    Das kleine Übungsprogramm soll eine Text-Datei einlesen und verändern.

    Hier der Code:

    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;

    int main () {
    const string dateiname {"spieler.txt"};
    ifstream quelle(dateiname); //Objekt für Eingabestrom
    if (!quelle.good()) { //Fehlerabfrage
    cerr << dateiname << " kann nicht geöffnet werden!\n";
    return 1; //ungleich o bedeutet Fehler
    }
    unsigned int punktsumme = 0;
    while (quelle.good()) {
    string zeile;
    getline(quelle, zeile);
    if(zeile.at(0) == '#' || !quelle.good()) {
    break; //nichts mehr zu lesen: Abbruch der Schleife
    }
    cout << "spieler " << zeile << " registriert. ";
    getline(quelle, zeile); //Es folgt die Umwandlung des Strings in eine Zahl:
    auto punktzahl = stoul(zeile);
    cout << "Punktzahl " << punktzahl << '\n';
    punktsumme += punktzahl;
    }
    cout << "Summe aller Punkte = " << punktsumme << '\n';
    return 0;
    }

    Wenn ich diesen compiliere und ausführen will kommt folgende Fehlermeldung:

    spieler 2 registriert. terminate called after throwing an instance of 'std::invalid_argument'
    what(): stoul

    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.

    Kann mir jemand behilflich sein?



  • Hallo Fred,

    Fred91 schrieb:

    terminate called after throwing an instance of 'std::invalid_argument'

    Zitat aus der Beschreibung von stoul:

    cplusplus.com schrieb:

    If no conversion could be performed, an invalid_argument exception is thrown.

    heißt, dass die Funktion stoul den String in ' zeile ' nicht in eine Zahl umwandeln kann. Was wahrscheinlich daran liegt, dass Du vorher die nächste Zeile einliest und dort die erwartete Punktzahl nicht steht.

    Poste mal einen Auszug aus der Datei, die dort gelesen wird.

    Gruß
    Werner

    PS.: Ich hoffe, dass der Code nicht so in dem Buch von Breymann steht!



  • die Text Datei heißt Spieler.txt und beinhaltet:

    fred
    40
    fred2
    50

    Der Code steht genauso im Buch.

    PS: Danke für deine Hilfe



  • Mit der Ausgabe

    spieler 2 registriert.

    würde ich in der ersten Zeile eine 2 erwarten.



  • "Genauso" wahrscheinlich nicht. Eher ähnlich abgetippt. Alleine das Zeichen 'o' im Kommentar. Auch muss "spieler.txt" wie im Code klein geschrieben werden. Bei mir funktioniert der aber.

    #include <fstream>
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main ()
    {
        const string dateiname {"spieler.txt"};
        ifstream quelle(dateiname); //Objekt für Eingabestrom
        if (!quelle.good())   //Fehlerabfrage
        {
            cerr << dateiname << " kann nicht geöffnet werden!\n";
            return 1; //ungleich o bedeutet Fehler
        }
        unsigned int punktsumme = 0;
        while (quelle.good())
        {
            string zeile;
            getline(quelle, zeile);
            if(zeile.at(0) == '#' || !quelle.good())
            {
                break; //nichts mehr zu lesen: Abbruch der Schleife
            }
            cout << "spieler " << zeile << " registriert. ";
            getline(quelle, zeile); //Es folgt die Umwandlung des Strings in eine Zahl:
            auto punktzahl = stoul(zeile);
            cout << "Punktzahl " << punktzahl << '\n';
            punktsumme += punktzahl;
        }
        cout << "Summe aller Punkte = " << punktsumme << '\n';
        return 0;
    }
    
    spieler fred registriert. Punktzahl 40
    spieler fred2 registriert. Punktzahl 50
    Summe aller Punkte = 90
    
    Process returned 0 (0x0)   execution time : 0.016 s
    Press any key to continue.
    


  • Die Beispiele können von der Internetseite zum Buch gedownloadet werden. Das kann Abschreibfehler vermeiden.



  • Ja, wollte ich auch vorschlagen 😉

    Was ich mich frage, gibt es mehrere spieler.txt? Geht ja irgendwie nicht? Was soll dann aber

    if(zeile.at(0) == '#' || !quelle.good())
    {
        break; //nichts mehr zu lesen: Abbruch der Schleife
    }
    

    ?
    std::getline() weiß doch, wann nichts mehr kommt und wenn !quelle.good() wird erst gar nicht angefangen zu lesen.



  • Ich habe es mit dem heruntergeladenen Code auch probiert.
    Da kam genau die selbe Meldung.
    Komischerweise als ich heute mein Rechner neu gestartet habe, hat es auch funktioniert.
    Jetzt kommt der Fehler nichtmehr.
    Würde mich trotzdem interessieren warum diese Fehlermeldung kam.
    Danke an alle.


Anmelden zum Antworten