Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

21

30.06.2010, 12:40

du hattest doch schon eine ausgabe. du musst nur das cout austauschen...
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

22

30.06.2010, 13:47

So, ich hab meinen Code jetzt überarbeitet.
Es funktioniert allerdingst immer noch nicht und ich hoffe, dass ihr mir jetzt sagen könnt, wo mein fehler liegt ^^

Hier nochmal mein ganzer Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Highscore.hpp:

#ifndef HIGHSCORE_HPP
#define HIGHSCORE_HPP

#include <iostream>
#include <map>
#include <fstream>
#include <sstream>

using namespace std;

class CHighscore
{
public:
void Load(char* cPath);
void Save(char* cPath);
void Clear();

void AddScore(const string &sName, float fScore);

bool empty() {return (m_HighscoreMap.empty());};

multimap<float,string,greater<float>> GetHighscoreMap() { return (m_HighscoreMap); }

private:
multimap<float,string,greater<float>> m_HighscoreMap; //Die Multimap für den Highscore
};

#endif

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Highscore.cpp:

#include "Highscore.hpp"

//Funktion zum Laden einer Highscore - Multimap aus einer Datei 
void CHighscore::Load(char* cPath)
{
char cName[5], cScore[9];
float fScore;

ifstream Input(cPath,ios::binary);
if(Input == NULL)
{
cout << "Fehler beim öffnen der Datei: " << cPath << endl;
}
else
{

while(!Input.eof())
{
Input.getline(cScore,sizeof(cScore));
Input.getline(cName,sizeof(cName));

//String Score in float umwandeln
istringstream score(cScore);
score >> fScore;

//Daten in die Map schreiben
m_HighscoreMap.insert(make_pair(fScore,cName));
}
 Input.close();
}
}

//Funktion zum speichern einer Highscore - Multimap in einer Datei
void CHighscore::Save(char* cPath)
{
ofstream Output(cPath,ios::binary);
if(Output == NULL)
{
cout << "Fehler beim öffnen der Datei: " << cPath << endl;
}
else
{
multimap<float,string,greater<float>>::iterator It;
for(It = m_HighscoreMap.begin(); It != m_HighscoreMap.end(); It++)
{
Output << It->first << endl << It->second.c_str() << endl;
}
Output.close();
}
}

//Funktion zum Löschen aller Daten in der Highscor - Map
void CHighscore::Clear()
{
m_HighscoreMap.clear();
}

//Funktion zum Hinzufügen von neuen Daten in der Highscore - Map
void CHighscore::AddScore(const string &sName, float fScore)
{
pair<float,string> pair;
pair = make_pair(fScore,sName);
m_HighscoreMap.insert(pair);
}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
main.cpp:

#include <iostream>
#include "Highscore.hpp"

using namespace std;

int main()
{
CHighscore Highscore;

Highscore.Load("Data/hsc.hsc");
Highscore.AddScore("Jojo",125);
Highscore.Save("Data/hsc.hsc");

Highscore.Clear();

Highscore.Load("Data/hsc.hsc");

multimap<float,string,greater<float>> Map;
multimap<float,string,greater<float>>::iterator It;

Map = Highscore.GetHighscoreMap();

for(It = Map.begin(); It != Map.end(); It++)
{
cout << It->second.c_str() << " : " << It->first << endl;
}
}

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

23

30.06.2010, 13:56

deine daten werden jetzt anders gespeichert also musst du sie auch anders laden...
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

24

30.06.2010, 14:29

Aber das speichern stimmt so?
Nur beim Laden mach ich nen Fehler?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

25

30.06.2010, 14:31

also ich seh keinen fehler beim speichern, müsste funktionieren.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

26

30.06.2010, 17:24

Sooo ... Ich hab meine Klasse jetzt fertig.
Ich würde gerne wissen, ob ich das zu kompliziert gemacht habe, bzw ob es eine bessere Lösungsmögligkeit geben würde.

Ich habe auch die Save - Funktion ein wenig modifizieren müssen, werhalb ich erneut den gesammten Code posten werde.

Es gibt aber noch ein kleines Problem.
Meine Klasse funktioniert nur dann Fehlerfrei, wenn ich die Zeile 12 in der main.cpp auskommentiere.
Sonst bekomme ich seltsame Resultate bei der Ausgabe am Schluss. Woran liegt das?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Highscore.hpp: (Keine änderung. Poste sie nur der Vollständigkeits halber)

#ifndef HIGHSCORE_HPP
#define HIGHSCORE_HPP

#include <iostream>
#include <map>
#include <fstream>
#include <sstream>

using namespace std;

class CHighscore
{
public:
    void Load(char* cPath);
    void Save(char* cPath);
    void Clear();
    void AddScore(const string &sName, float fScore);

    bool empty() {return (m_HighscoreMap.empty());};

    multimap<float,string,greater<float>> GetHighscoreMap() { return (m_HighscoreMap); }

private:
    multimap<float,string,greater<float>> m_HighscoreMap; //Die Multimap für den Highscore

    
};

#endif

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
Higscore.cpp:

#include "Highscore.hpp"

//Funktion zum Laden einer Highscore - Multimap aus einer Datei 
void CHighscore::Load(char* cPath)
{
    Clear(); //Löscht die Multimap

    ifstream Input(cPath,ios::binary);

    string sData; //Inhalt der Datei
    int beginFirst = 0, beginSecond = 0; //Startpositionen der Daten
    int endFirst = 0, endSecond = 0; //Endposition der Daten

    string sName = "", sScore = ""; //Name und Punkte als String
    float fScore = 0.0f; //Punkte als Float


    if(Input == NULL)
    {
        cout << "Fehler beim öffnen der Datei: " << cPath << endl;
    }
    else
    {
        //Einlesen der Datei in einen String
        Input >> sData;
        Input.close();

        //Berechnen der Start - und Enddaten
        endFirst = sData.find("/first",endSecond);
        endSecond = sData.find("/second",endFirst);
        beginFirst = 0;
        beginSecond = endFirst + 6;

        //Auswertung des Strings
        while(endFirst != string::npos || endSecond != string::npos)
        {
            //Einlesen der Punkte
            for(int i = beginFirst; i <= endFirst-1; i++)
                sScore += sData.at(i);

            //Umwandeln der Punkte in einen float - Wert
            fScore = static_cast<float> (atof(sScore.c_str()));
            
            //Einlesen des Namens
            for(int i = beginSecond; i <= endSecond-1; i++)
                sName += sData.at(i);

            //Multimap mit Daten  füllen
            m_HighscoreMap.insert(make_pair(fScore,sName));

            //Berechnen der Start - und Enddaten
            beginFirst = endSecond + 7;
            endFirst = sData.find("/first",endSecond);
            endSecond = sData.find("/second",endFirst);
            beginSecond = endFirst + 6;
        }
    }
}

//Funktion zum speichern einer Highscore - Multimap in einer Datei
void CHighscore::Save(char* cPath)
{
    ofstream Output(cPath,ios::binary);
    if(Output == NULL)
    {
        cout << "Fehler beim öffnen der Datei: " << cPath << endl;
    }
    else
    {
        multimap<float,string,greater<float>>::iterator It;
        for(It = m_HighscoreMap.begin(); It != m_HighscoreMap.end(); It++)
        {
            Output << It->first << "/first" << It->second.c_str() << "/second";
        }
        Output.close();
    }
}

//Funktion zum Löschen aller Daten in der Highscor - Map
void CHighscore::Clear()
{
    m_HighscoreMap.clear();
}

//Funktion zum Hinzufügen von neuen Daten in der Highscore - Map
void CHighscore::AddScore(const string &sName, float fScore)
{
    pair<float,string> pair;
    pair = make_pair(fScore,sName);
    m_HighscoreMap.insert(pair);
}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
main.cpp:

#include <iostream>
#include "Highscore.hpp"

using namespace std;

int main()
{
    CHighscore Highscore;
 
//  Highscore.Load("Data/hsc.hsc");
    
    Highscore.AddScore("Jojo",125);

    Highscore.Save("Data/hsc.hsc");
 
    Highscore.Load("Data/hsc.hsc");

    multimap<float,string,greater<float>> Map;
    multimap<float,string,greater<float>>::iterator It;

    Map = Highscore.GetHighscoreMap();

    for(It = Map.begin(); It != Map.end(); It++)
    {
        cout << It->second.c_str() << " : " << It->first << endl;
    }
}

Werbeanzeige