Problem beim Auslesen aus einer Datei



  • Hallo,
    ich habe schon viel nachgelesen und probiert aber ich komme nicht weiter, ich hoffe ihr könnt mir helfen
    Ich benutze den C++ Builder 2010, ich hoffe ich bin hierfür im richtigen Forum

    Zu meinem Problem ich programmiere ein kleines Spielchen als Projekt für die Schule, alles läuft so weit und nur noch die Highscore fehlt.
    Diese möchte ich in einer Datei abspeichern und auslesen. Abspeichern ist kein Problem aber auslesen und vorallem dass ordnen und ausgeben macht mir zu schaffen.

    ofstream schreiben;
    schreiben.open("Test.txt", ios::out | ios::app );
    schreiben << g_Punkte << "\n";
    schreiben.close();
    

    dass hier zum schreiben, was auch funktioniert

    fstream lesen;
    char cstring[4];
    char anzPunkte = g_Punkte;
    lesen.open("Test.txt", ios::in);
    for (int i = 0; i < 10; i++) {
    	lesen.getline(cstring, 5);
    	if (cstring > anzPunkte){
    		anzPunkte = cstring;
    		}
    	}
    lesen.close();
    

    Problem hierbei ist der Vergleich von char und *char, aber wie schaff ich es einen *char in einen einfachen char oder int oder was auch immer zu Bekommen, oder bin ich auf dem ganz falschen Pfad? ich fang langsam an zu verzweifeln.
    Ausgeben möchte ich das ganze außerdem in eine TMemo in der ich nur TStrings ausgeben kann



  • Wenn du sowieso nur Zahlen in der Datei hast, solltest du sie auch direkt in eine Zahl zurücklesen:

    fstream lesen("Test.txt", ios::in);
    int akt_punkte,max_punkte=0;
    char anzPunkte = g_Punkte;
    for (int i = 0; i < 10; i++) {
        lesen >> akt_punkte
        if (akt_punkte > max_punkte){
            max_punkte = akt_punkte;
        }
    }
    

    (und für das Sortieren solltest du alle Einträge in einen STL-Container werfen und dann einmal std::sort() drüber schicken)



  • Vielen Dank, 🙂
    funktioniert eiwandfrei und ich bin endlich fertig
    fals irgendjemand meinen fertigen code interessiert:

    ofstream schreiben;
    schreiben.open("Test.txt", ios::out | ios::app );
    schreiben << g_Punkte << "\n";
    schreiben.close();
    fstream lesen("Test.txt", ios::in);
    int akt_punkte;  
    vector<int> v;
    char anzPunkte = g_Punkte;
    for (int i = 0; i < 100; i++) {
    	lesen >> akt_punkte;
    	v.push_back (akt_punkte);
    	}
    sort(v.begin(), v.end(), reverseSort());
    for (int i=0; i < 10; i++) {
    ListBox1->Items->Add(IntToStr(i+1) + "." + IntToStr(v[i]));
    }
    


  • Nachdem dein Hauptproblem gelöst ist, hätte ich noch ein paar Bonus-Hinweise:

    • Anstatt dich auf eine feste Anzahl festzulegen, solltest du so lange lesen, bis die Datei zu Ende ist:
    while(lesen>>akt_punkte)
      v.push_back(akt_punkte);
    
    • Extra eine eigene Vergleichsfunktion zu schreiben wäre nicht nötig gewesen - für Sortierung in umgekehrter Reihenfolge reicht greater<int> völlig aus
    • Wenn du im laufenden Programm mehrere Werte verarbeiten willst, mußt du dazu nicht jedes Mal die komplette Liste einlesen (eventuell sogar in einer multiset<>, da ersparst du dir das manuelle Sortieren). Da reicht es, einmal die alten Highscores zu laden und nach jeder Runde den erreichten Wert dort einzusortieren.
    • Was für einen Zweck soll denn Zeile 8 haben?
    • ich bin mir zwar nicht sicher, was anzPunkte darstellen soll, aber ein char könnte eventuell etwas klein dafür werden 😉

Anmelden zum Antworten