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;
}
}
|