000
29.03.2004, 20:10 Uhr
H4ll0w33n
|
Hallo zusammen!
Habe ein Progrämmelche geschrieben, das die Rangliste von Spielern in einer Datei binär abspeichert und zwar in der Form: <Name> <Wins> <Losses> <Ranglistenpunkte> z.B: MasterBlaster 100 60 1024 Bei jedem neuen Einfügen wird die Datei in ein Array eingelesen und dieses sortiert und falls, der Spielername des neuen Datensatzes bereits in einem alten vorhanden ist, so wird dieser nur aktualisiert.
Umgesetzt habe ich das wie folgt:
| C++: |
/************************************************ * Prozedur FExist ************************************************* * -> Prüft Existenz einer Datei * -> Parameter: - name == zu prüf. Datei ************************************************/ bool FExist(char* name) { ifstream source; source.open(name,ios::binary|ios::in); if (!source) {return true; } else {CloseFile(name); return false;} }
/************************************************ * Prozedur AppendData ************************************************* * -> Fügt neue Daten in Sortierung ein * -> Parameter: - name == zu prüf. Datei * - n == Spielername * - w == Wins * - l == Losses * - r == Rating ************************************************/ bool AppendData(char* name,char* n, int w, int l, int r) { if (FExist(name)) { WriteData(name, n, w, l, r); } else { fstream File(name, ios::in|ios::binary); int pos=-1; const int zeilen=DataCount(name); bool flag=false; int z=DataCount(name); player p[zeilen+1]; for (int x=0;x<zeilen;x++) { File.read(reinterpret_cast<char*>(&p[x]), sizeof(p[x])); if (p[x].name==n) {pos=x; flag=true;} } CloseFile(name); if (flag) { p[pos].name=n;p[pos].wins=w;p[pos].losses=l;p[pos].rating=r; z=z-1; } else { p[z].name=n;p[z].wins=w;p[z].losses=l;p[z].rating=r; } // Datensätze sortieren player tmp; if (z!=1) { for (int y=0;y<=z-1;y++) { pos=y; // Vorläufiges Max for (int x=y+1;x<=z;x++) { // Neues Maximum gefunden? if (p[x].rating>p[pos].rating) {pos=x;} } if (pos!=y) { tmp.name=p[pos].name; tmp.wins=p[pos].wins; tmp.losses=p[pos].losses; tmp.rating=p[pos].rating; p[pos].name=p[y].name; p[pos].wins=p[y].wins; p[pos].losses=p[y].losses; p[pos].rating=p[y].rating; p[y].name=tmp.name; p[y].wins=tmp.wins; p[y].losses=tmp.losses; p[y].rating=tmp.rating; } } } // Daten neu schreiben fstream FS(name, ios::out|ios::trunc); CloseFile(name); for (int d=0; d<=z; d++) { WriteData(name, p[d].name, p[d].wins, p[d].losses, p[d].rating); } } }
/************************************************ * Prozedur WriteData ************************************************* * -> Schreibt neuen Datensatz * -> Parameter: - name == zu prüf. Datei * - n == Spielername * - w == Wins * - l == Losses * - r == Rating ************************************************/ bool WriteData(char* name, char* n, int w, int l, int r) { player p; p.name = n; p.wins=w; p.losses=l; p.rating=r; fstream File(name, ios::out|ios::app|ios::binary); File.write(reinterpret_cast<const char*>(&p), sizeof(p)); CloseFile(name); }
/************************************************ * Prozedur ReadData ************************************************* * -> Liest Datensatz aus einer Datei * -> Parameter: - name == zu prüf. Datei ************************************************/ bool ReadData(char* name) { ifstream File; File.open(name, ios::binary|ios::in); if (File) { const int z=DataCount(name); player pfield[z]; for (int x=0;x<z;x++) { File.read(reinterpret_cast<char*>(&pfield[x]), sizeof(pfield[x])); cout << pfield[x].rating << " " << pfield[x].name <<" " << pfield[x].wins << "/" << pfield[x].losses << endl; } char c; cin >>c; } CloseFile(name); }
/************************************************ * Prozedur DataCount ************************************************* * -> Gibt Anzahl Datensätze zurück * -> Parameter: - name == zu prüf. Datei ************************************************/ int DataCount(char* name) { fstream File(name, ios::in|ios::binary); player p; int x=-1; while (!File.eof()) { File.read(reinterpret_cast<char*>(&p), sizeof(p)); x++; } CloseFile(name); return x; }
/************************************************ * Prozedur CloseFile ************************************************* * -> Schließt Datei u. setzt Status zurück * -> Parameter: - name == zu prüf. Datei ************************************************/ bool CloseFile(char* name) { fstream File(name); File.close(); File.clear(); }
|
Wenn ich testweise eine main() bastel und folgendes teste:
| C++: |
AppendData("data.txt", "D4",1,2,7656); AppendData("data.txt", "D3",3,4,1025); AppendData("data.txt", "D2",2,3,8555); AppendData("data.txt", "D1",666,999,9999); AppendData("data.txt", "D1",666,999,1030); ReadData("data.txt");
|
=> Funktionierts ohne Probleme!, Ausgabe: 8555 D2 2/3 7656 D4 1/2 1030 D1 666/999 1025 D3 3/4
Kommentiere ich jedoch AppendData's aus, so gehts nimmer!???
| C++: |
//AppendData("data.txt", "D4",1,2,7656); //AppendData("data.txt", "D3",3,4,1025); //AppendData("data.txt", "D2",2,3,8555); //AppendData("data.txt", "D1",666,999,9999); //AppendData("data.txt", "D1",666,999,1030); ReadData("data.txt");
|
Ausgabe: 8555 ↑ïêE*ÃE°♣ 2/3 7656 data.txt 1/2 1030êE*ÃE°♣ 666/999 1025 Õâý↑ïêE*ÃE°♣ 3/4
Die Datei muss danach auch gelöscht werden, weil sie diese Einträge tatsächlich zu beinhalten scheint und somit unbrauchbar ist! Kann mir wer sagen wo hier der Fehler liegt? Bin darüber hinaus auch an Verbesserungsvorschlägen interessiert!
Danke & Grüße Kai Dieser Post wurde am 30.03.2004 um 09:50 Uhr von Pablo editiert. |