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

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

11

18.01.2011, 16:01

Danke dir SaRu dass du mir deine wertvolle Zeit opferst
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

12

18.01.2011, 16:37

Danke dir SaRu dass du mir deine wertvolle Zeit opferst

Jaa ich weiß, ich bin ein Held. :lol:

Du könntest entweder deine Daten Zeile für Zeile in die Datei schreiben und dann auch wieder so auslesen. (Benutze dafür ifstream)
Du könntest aber auch deine Daten an einem Stück, seperiert mit einem festgelegten Trennzeichen, in die Datei schreiben und danach die komplette Datei auslesen und anhand dieses Trennzeichens wieder die Daten voneinander unterscheiden. Das ist auch nicht so schwer...
Oder aber du schreibst deine Daten als Struktur in die Datei, ließt sie danach wieder aus und behandelst sie weiterhin wie eine Struktur. (Deine Struktur Score ist ja schonmal ein Beispiel.)

Vielleicht hilft dir 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
 // 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;
    }

}



Gruß
SaRu_

13

18.01.2011, 23:29

Kabuuum: http://www.cplusplus.com/reference/iostr…perator_voidpt/ ... autsch!

ach zum thema:

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));
}
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Deviloper« (18.01.2011, 23:37)


Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

14

19.01.2011, 16:56

Ja also ich bleibe lieber mal bei meinem System, dass ich das Zeilenweise mache, und habe jetzt folgendes Problem:
Ich speichere jetzt mal alle Daten, mit der Methode save(), doch warum das nicht so klappt wie ich soll verstehe ich einfach nicht, er meint, dass ich das erste Argument, falsch übergebe, woran liegts denn?

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


Was funktioniert denn nicht? (Es ist in der Methode saveHighscores, und zwar, wenn save aufgerufen wird)
Hier die Fehlermeldung:

Quellcode

1
F:\C++ Projekte\X-Games-Library\Highscores.cpp|104|error:   initializing argument 1 of 'void Highscores::save(std::ofstream, std::string)'|


M.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

15

19.01.2011, 17:58

Schau dir mal die Funktion von Deviloper genau an, was macht die... ? Richtig! Die übernimmt für dich das Schreiben in die Datei. Also solltest du dein data.write() mal durch diese Funktion austauschen.
Und der Funktion save() solltest du eine Referenz des Stream-Objekts übergeben.

So in der Art:

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


Gruß
SaRu_

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

16

19.01.2011, 18:15

Verzeihung, aber ich bin beim Besten Willen nicht im Stande den Code nachzuvollziehen, geschweigedenn ihn in mein Projekt miteinzubinden, könnten wir uns vllt. via Skype mal austauschen? SaRu, ich habe dich in Skype geadded.
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

17

20.01.2011, 15:40

Nach einem langen Gespräch mit SaRu haben wir es trotzdem nicht geschafft, das glaubst mindestens du SaRu.
Ich habe heute noch einmal etwas geändert, es ist so klein, da könnten man sich richtig ärgern, der einzige, klitzekleine Fehler war folgender :
Wir hätten nur die Struktur in der Header Datei einfach vor den vector, der diese als Parameter enthält setzten müssen.

So danke trotzdem euch allen, es klappt jetzt,
m.f.G. Developer-X!
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

18

20.01.2011, 16:00

Also als du mir dein Quellcode noch geschickt hast, hat bei mir alles funktioniert... ;)

Gruß
SaRu_

19

20.01.2011, 17:01

Och eigtl. ist die ganz einfach ;) vereinfachte erklärung

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;
}
So klar?
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

20

20.01.2011, 17:26

@Deviloper
Ja, jetzt ist mir das wirklich klar geworden, bis auf eine Sache, wir legen ja die Funktionsschablone an, doch wo steht der Name der Funktion?

@SaRu
Liegt wahrscheinlich an den unterschiedlichen Compilern die wir verwenden, ich nutze den MinGW, bei CodeBlocks.

Danke euch allen!
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Werbeanzeige