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
Danke dir SaRu dass du mir deine wertvolle Zeit opferst
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 |
// So könntest du die Datei komplett auslesen (wohl eher ein Minimalbeispiel): void Highscores::loadHighscores() { ifstream data ("Highscores.bin", ios::in | ios::binary); if(data.fail()) { cout << "Konnte Datei nicht oeffnen." << endl; } else { data.seekg (0, ios::end); // Zeiger zum Ende der Datei int length = data.tellg(); // Länge der Datei ermitteln data.seekg (0, ios::beg); // Zeiger wieder zu Anfang char * buffer = new char [length]; // Speicher zum Auslesen reservieren data.read(buffer, length); // Komplette Datei in Buffer speichern data.close(); // Datei schliesen cout << buffer << endl; // Buffer ausgeben delete[] buffer; } } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
template <typename _T> std::ofstream& write_binary(_T const& data, std::ofstream& out) { return out.write(reinterpret_cast<const char*>(&data), sizeof (_T)), out; } template <> std::ofstream& write_binary(std::string const& data, std::ostream& out) { const std::size_t length(data.length() + 1); out.write(reinterpret_cast<const char*>(&size), sizeof (std::size_t)); out.write(data.c_str(), length); return out; } int main() { std::ofstream file_stream("output.dat", std::ios_base::binary); write_binary(std::string("sample"), write_binary(15, file_stream)); } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Deviloper« (18.01.2011, 23:37)
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 |
void Highscores::save(ofstream data, std::string content) { data.write(content.c_str(),sizeof(content.c_str())); } void Highscores::saveHighscores() { ofstream data ("Highscores.bin", ios::out | ios::binary); int scoresSize = scores.size(); save(data,toCharArray(scoresSize)); // Anzahl der Profile speichern for(int i = 0;i<scoresSize;i++) { data.write(toCharArray(static_cast<int>(scores[i].name.size())).c_str(),100); // Länge des Namens speichern data.write(scores[i].name.c_str(),100); // Name speichern data.write(toCharArray(scores[i].points).c_str(),100); // Punkte speichern data.write(toCharArray(static_cast<int>(scores[i].date.size())).c_str(),100); // Länge des Datums speichern data.write(scores[i].date.c_str(),100); // Datum speichern } data.close(); } string Highscores::toCharArray(long l) { stringstream ss; ss << l; return ss.str(); } string Highscores::toCharArray(int i) { stringstream ss; ss << i; return ss.str(); } |
Quellcode |
|
1 |
F:\C++ Projekte\X-Games-Library\Highscores.cpp|104|error: initializing argument 1 of 'void Highscores::save(std::ofstream, std::string)'| |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
// statt void Highscores::save(ofstream data, std::string content) // mit Referenz void Highscores::save(ofstream &data, std::string content) // Statt write direkt aufzurufen, einfach die Funktion save() save(data,Punkte.name); save(data,Punkte.date); save(data,toCharArray(Punkte.points)); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
template <typename _T> // hiermit sagen wir das wir ne Funktionsschablone anlegen sollen, d.h. das er anstelle unseres _Ts später immer den entsprechenden Variablentyp setzen soll (std::string, int, ...) std::ofstream& write_binary(_T const& data, std::ofstream& out) // wir bekommen übergeben was geschrieben werden soll (data) und worein das geschehen soll (out), weils schonmal ganz praktisch sein kann, geben wir unseren Stream auch wieder zurück (kannst z.B. dann einfach gucken (if (write_binary(...)), wodurch der dann die fehlerstates des strings abfragt!) { out.write(reinterpret_cast<const char*>(&data), sizeof (_T)); // damit casten wir die daten die wir bekommen in nen char-Zeiger (wies die funktion verlangt) und übergeben noch die größe der Daten return out; } template <> // Nun gibt es einen Sonderfall, der anders gespeichert wird, der std::string. D.h. wir spezialisieren unsere Schablone std::ofstream& write_binary(std::string const& data, std::ostream& out) // Und geben anstelle des _Ts den entsprechenden Typ an, den wir speziell behandeln wollen. { const std::size_t length(data.length() + 1); // die länge des Strings + Null-Terminierungszeichen out.write(reinterpret_cast<const char*>(&size), sizeof (std::size_t)); // Die größe speichern wir out.write(data.c_str(), length); // Und danach den String selbst, eigtl. sizeof (char_type) * length, aber sizeof (char) nehm ich mal als == 1 an ;) return out; } |
Werbeanzeige