Neuling überfordert, Haltepunkt ausgelöst bei Speichervorgang einer .txt



  • Hallo zusammen,

    ich habe anhand eines Youtube-Tutorials ein Zahlenratespiel erstellt und wollte dieses nun durch einen Highscore erweitern, der die Anzahl der Versuche sowie den Namen des Spielers in eine .txt-Datei speichert. Leider weiß ich nicht, was mir die Fehlermeldung sagen möchte. Habe erst frisch mit C++ angefangen.. 😊

    #include <iostream>
    #include <stdio.h>
    #include <time.h>
    #include <fstream>
    #include <string>
    
    using namespace std;
    fstream txtd;
    
    
    void RunGame() {
    	int randomNummer = rand() % maxNumber + 1; // die gesuchte Zufallszahl.
    	int guess = 0; //Eingabe Nutzer.
    	int tries = 0; //Anzahl Versuche.
    	cout << "Die gesuchte Zahl ist zwischen 1 und " << maxNumber << " (beide inklusive)" << endl;
    	do {
    		guess = GetUserGuess(); //Aufforderung zur Eingabe.
    		tries++; //Versuche, die hochgezählt werden.
    	} while (!ValidateUserGuess(guess, randomNummer)); // hier wird die Eingabe und die oben erstelle Zufallszahl an die Fuktion übergeben, die dann dort verglichen wird.
    
    	cout << "Du hast " << tries << " Versuche benoetigt!" << endl << endl;
    
    	cout << "Bitte gib deinen Namen fuer den Highscore ein: ";
    	string nickname;
    	cin >> nickname;
    
    	//Dateiverarbeitung
    	txtd.open("highscore.txt", ios::out, ios::app);				// Datei wird geöffnet
    	txtd << nickname << " - " << tries << " Versuche" << endl;	// Highscore wird gespeichert	
    	txtd.close();												// Datein wird geschlossen
    	//Ausgabe
    	cout << endl << "Vielen Dank " << nickname << endl << "Dein persoenlicher Highscore wurde gespeichert!" << endl << endl;
    	
    }
    

    Ich habe hier eine Funktion, wo ich auch die Dateiverarbeitung mit eingebaut habe. Ich bekommen jedoch, sobald ich einen Namen eingegeben habe, die folgende Fehlermeldung:

    • In Zeile 29 hat ein Haltepunkt ausgelöst

    Wo könnte das Problem liegen? Vielen Dank im Voraus!

    Viele Grüße
    André



  • Verwendest Du Visual Studio und hat Zeile 29 zufällig ein rotes Pünktchen links? Wenn ja: Pünktchen wegmachen.
    Wenn nein: Zeig' vollständigen Code!



  • Ja, ich verwende Visual Studio.

    Aber ich bekomme da diesen roten Punkt nicht weg. Muss ich da eine Ausnahme hinzufügen?



  • Auf den Punkt rechtsklicken.



  • Oder Cursor in die Zeile mit dem Punkt stellen und F9 drücken.
    Oder das Fenster "Haltepunkte" bzw. "Breakpoints" einblenden, dort den Breakpoint auswählen und dann löschen.



  • Hmm, selbst wenn ich den Haltpunkt lösche, wird das Programm ja nicht weiter ausgeführt...

    ich habe hier vorsichtshalber den kompletten Code einmal:

    #include <iostream>
    #include <stdio.h>
    #include <time.h>
    #include <fstream>
    #include <string>
    
    using namespace std;
    fstream txtd;
    
    const int maxNumber = 100; // Eine Constante Zahl, die die maximale Größe angibt, bis zu welchem Punkt die gesuchte Zahl geht.
    
    char Menu() {
    	char input = ' ';
    	cout << "Menu\n\n(P)lay\n(Q)uit\n\n";
    	cout << "Input: ";
    	cin >> input;
    	system("CLS"); //clear Konsole
    	return input;
    }
    
    int ValidateUserGuess(int guess, int rightResult) {
    
    	if (guess == rightResult) {
    		cout << "GESCHAFFT! Du hast die Korrekte Zahl erraten" << endl << endl;
    		return true;
    	}
    	else if (guess <= rightResult) {
    		cout << "Die gesuchte Zahl ist groesser!" << endl << endl;
    		return false;
    	}
    	else if (guess >= rightResult) {
    		cout << "Die gesuchte Zahl ist kleiner!" << endl << endl;
    		return false;
    	}
    	else {
    		cout << "Ungueltige Eingabe!\n\n";
    		return false;
    	}
    
    }
    
    //Diese Funktion fordert den Nutzer zur Eingabe auf
    int GetUserGuess() {
    	int guess = 0;
    	cout << "Dein Tipp: ";
    	cin >> guess;
    	return guess;
    }
    
    void RunGame() {
    	int randomNummer = rand() % maxNumber + 1; // die gesuchte Zufallszahl.
    	int guess = 0; //Eingabe Nutzer.
    	int tries = 0; //Anzahl Versuche.
    	cout << "Die gesuchte Zahl ist zwischen 1 und " << maxNumber << " (beide inklusive)" << endl;
    	do {
    		guess = GetUserGuess(); //Aufforderung zur Eingabe.
    		tries++; //Versuche, die hochgezählt werden.
    	} while (!ValidateUserGuess(guess, randomNummer)); // hier wird die Eingabe und die oben erstelle Zufallszahl an die Fuktion übergeben, die dann dort verglichen wird.
    
    	cout << "Du hast " << tries << " Versuche benoetigt!" << endl << endl;
    
    	cout << "Bitte gib deinen Namen fuer den Highscore ein: ";
    	string nickname;
    	cin >> nickname;
    
    	//Dateiverarbeitung
    	txtd.open("highscore.txt", ios::out, ios::app);				// Datei wird geöffnet
    	txtd << nickname << " - " << tries << " Versuche" << endl;	// Highscore wird gespeichert	
    	txtd.close();												// Datein wird geschlossen
    	//Ausgabe
    	cout << endl << "Vielen Dank " << nickname << endl << "Dein persoenlicher Highscore wurde gespeichert!" << endl << endl;
    	
    }
    
    void RunMenu() {
    	// wird das Menü anzeigen.
    	while(true) {
    		char input = Menu();
    		if (input == 'P' || input == 'p') {
    			RunGame();
    		}
    		else if (input == 'Q' || input == 'q')
    		{
    			break;
    		}
    		else {
    			cout << "Input: '" << input << "' not reconized please try again:" << endl;
    		}
    	}
    
    }
    
    int main() {
    
    	srand(time(NULL)); //Zufallsgenerator wird initialisiert.
    	RunMenu();
    
    
    	return 0;
    }
    

    Warum macht VS das mit dem Haltepunkt. Verstehe den Hintergrund nicht.. 😕



  • Evtl. hast du aus Versehen mal auf den Rand des Codes geklickt und den Haltepunkt aktiviert?

    Das gehört alles zum "Debugging", d.h. um als Entwickler detailliert den Programmablauf nachzuverfolgen, s.a. Navigieren durch Code mit dem Visual Studio-Debugger.

    Nachdem das Programm an einem Haltepunkt (breakpoint) angehalten hat, kannst du einfach mit F5 (bzw. der grüne Button "Run") das Programm fortsetzen.



  • Zeile 67:

    @Dziko sagte in Neuling überfordert, Haltepunkt ausgelöst bei Speichervorgang einer .txt:

    	txtd.open("highscore.txt", ios::out, ios::app);				// Datei wird geöffnet
    

    Die Flags müssen mit or (|) verknüpft werden.



  • Super, herzlichen Dank! Daran hat es gelegen.

    Manchmal sieht man den Wald vor lauter Bäumen nicht mehr .. 😄



  • @Swordfish sagte in Neuling überfordert, Haltepunkt ausgelöst bei Speichervorgang einer .txt:

    txtd.open("highscore.txt", ios::out, ios::app); // Datei wird geöffnet

    Die Flags müssen mit or (|) verknüpft werden.

    Das Problem stammt aber von was anderem: die Variable txtd ist global und nur ein std::fstream.

    Besser wäre, hier lokal eine Variable vom Typ std::ofstream zu erzeugen. Also die Variable aus Zeile 8 entfernen und eine Funktion für den Highscore machen:

    void append_to_highscores(const std::string &nickname, int tries) {
        std::ofstream highscorefile("highscore.txt", std::ios::app); // das ios::out ist wegen _o_fstream implizit dabei
        highscorefile << nickname << " - " << tries << " Versuche" << endl;
        // ich habe hier mal Fehlerbehandlung weggelassen
    } // das close passiert hier bei dem } automatisch
    
    // und dann
    
    append_to_highscores(nickname, tries);
    
    


  • @wob Ja, natürlich. Aber der Fehler beim Gedankengang ios ::out, ios::app ist halt schon der Operator.



  • @Swordfish sagte in Neuling überfordert, Haltepunkt ausgelöst bei Speichervorgang einer .txt:

    Aber der Fehler beim Gedankengang ios ::out, ios::app ist halt schon der Operator.

    Ja, vielleicht war "Das Problem stammt aber von was anderem" etwas übertrieben. Ich wollte eigentlich sagen: wenn man das alles schön klein hält und gleich std::ofstream nutzt, stellt sich die Frage, wie man 2 Parameter für den fstream verknüpfen muss, gar nicht erst 🙂


Log in to reply