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

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

1

12.03.2012, 09:50

Vector Speicherfunktion

Hey,
ich bin gerade dabei meine Vector klasse zu Speichern aber erstmal wollte ich die Größe des Vectors speichern.
Leider hänge ich gerade bei der Syntax fest und würde mich sehr um eure Tipps freuen.

Speicher Funktion.

C-/C++-Quelltext

1
2
3
4
5
6
void Speichern (vector<CPersonen> &vPersonen)
{
    ofstream Output ("Personen.data", ios::binary);
    Output.write (vPersonen.size(), sizeof vPersonen.size());
    Output.close ();
}


MFG:
Raidenkk / Kevin

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.03.2012, 10:12

C-/C++-Quelltext

1
2
3
4
5
6
void Speichern(const vector<CPersonen> &vPersonen)
{
  ofstream Output ("Personen.data", ios::binary);
  size_t size = vPersonen.size();
  Output.write (reinterpret_cast<const char*>(&size), sizeof(size));
}

3

12.03.2012, 11:24

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void Speichern(const vector<CPersonen> &vPersonen)
{
  ofstream Output ("Personen.data", ios::binary);

  //die länge
  size_t size = vPersonen.size();
  Output.write (reinterpret_cast<const char*>(&size), sizeof(size));

  //die eigentlichen daten:
 Output.write (reinterpret_cast<const char*>(&vPersonen[0]), sizeof(CPersonen)*size);
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Laden(const vector<CPersonen> &vPersonen)
{
  ifstream Output ("Personen.data", ios::binary);

  //die länge
  size_t size;
  Output.read(reinterpret_cast<const char*>(&size), sizeof(size));

  //Größe reservieren
  vPersonen.resize(size);

  //die eigentlichen daten:
 Output.read(reinterpret_cast<const char*>(&vPersonen[0]), sizeof(CPersonen)*size);
}


Das geht natürlich nur, wenn man CPersonen einfach so binär rausschreiben kann. Ansonsten musst du in einer Schleife für jede Person die Lade und Speicherfunktion aufrufen.
Lieber dumm fragen, als dumm bleiben!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

12.03.2012, 11:44

Den Ansatz würde ich nie empfehlen, Jonathan. Erstens wegen Alignment und Packing und zweitens wegen Referenz-Typen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

12.03.2012, 13:01

Wo ist das Problem mit Alignment? Das die Datei ein wenig größer wird?
Und wo ist das Problem mit Referenzen? Außer dass die zweite Funktion natürlich nicht kompiliert weil ich copy'n'paste benutzt habe und der vector konstant ist.
Lieber dumm fragen, als dumm bleiben!

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

6

12.03.2012, 14:14

Referenzen speichern glaub die Adressen beim nächsten start sind die Adressen nicht mehr auf die Daten gelinkt. Kann sein das ich Müll rede aber währe für mich plausibel ^^

7

12.03.2012, 14:36

Das wäre, wenn man die Inhalte von Zeigern in die Datei schreibt. Das würde hier passieren, wenn CPersonen intern Zeiger speichern würde, aber wie schon erwähnt müsste man dann die Personen eh einzeln abspeichern.
Lieber dumm fragen, als dumm bleiben!

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

8

12.03.2012, 14:48

Oh okay hmm würde jetzt ja sagen ich nehme dein Vorschlag Jonathan_Klein aber da es anscheinend noch Unstimmigkeiten gibt warte ich mal auf mehr Antworten danke aber schon einmal.

Gruß Raiden

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

9

12.03.2012, 15:21

Wo ist das Problem mit Alignment? Das die Datei ein wenig größer wird?
Und wo ist das Problem mit Referenzen? Außer dass die zweite Funktion natürlich nicht kompiliert weil ich copy'n'paste benutzt habe und der vector konstant ist.

Auf einer anderen Platform richtet der Compiler die Struktur vielleicht an nem anderen Alignment aus. Und dann ließt du nicht mehr die Daten richtig ein. Das ließe sich noch beheben, in dem man das Alignment vorgibt. Aus Effizienzgründen würde ich das aber für eine Vektorklasse aber vielleicht nicht tun.

Und ja, Referenzen, Zeiger usw. abspeichern macht keinen Sinn. Da gewinnste eher im Lotto, als das diese Addressen beim nächsten Programmstart noch richtig wären.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

10

12.03.2012, 15:24

Schreib für die CPersonen Klasse die Methoden read and write, die den stream als referenz entgegennehmen und schreibe/lese jedes Element einzeln (r)ein.
Beispiel für das formatierte Schreiben in einen Stream:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void ObjectImpl::save(std::ostream& stream)
{
    stream << m_Texture << ' ';
    m_WeaponBays->save(stream);
    stream << m_Velocity << ' ';
    stream << m_Agility << ' ';
    stream << !!m_IsPlayer << ' ';
    //...
}

und das Lesen aus einem Stream:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void ObjectImpl::load(std::istream& stream)
{
    int tmp;
    stream >> tmp;
    m_Texture = static_cast<TextureEnum>(tmp);
    m_Sprite->SetTexture(*m_Main->TextureManager().getResource(m_Texture));
    m_WeaponBays->load(stream);
    stream >> m_Velocity;
    stream >> m_Agility;
    stream >> m_IsPlayer;
    //...
}


Achte dabei darauf einen istream und keinen ifstream entgegen zu nehmen. Vielleicht willst du mal einen Stringstream anstelle des Filestreams benutzen. So kannst du ihn ohne Probleme 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?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »NachoMan« (12.03.2012, 15:30)


Werbeanzeige