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

Gelöschter Benutzer

unregistriert

1

03.08.2013, 20:22

Klassen und Speichern mit ofstream

Hallo,
ich habe ein Problem. Ich habe eine Klasse erstellt, in welcher die Gebäude von mir und der KI gesichert sind. Es handelt sich um eine einfache exe-Anwendung, die Gebäude, können z. B. 1 oder 0 sein (int), je nachdem werden sie am Bildschirm angezeigt oder nicht. In der Klasse sind meine Membervariablen private:, da mir dies im Buch empfohlen wurde. Ich habe die Instanzen Mensch und Gegner. Wenn ich mit einer Funktion der Klasse den Wert des Dorfes des Menschen sichere, ofstream Output1 ("Dorf_01", ios::binary) Output1.write ((char*) &Dorf_01, sizeof (Dorf_01)); Output1.close ();wird dieser auch ganz normal gesichert. Wenn ich dann aber den Schritt mit dem Gegner mache, überschreibt es die Datei, da es sich ja um den selben Output handelt. Ich vermute, dass man die Variablen "einzeln" (z. B. Mensch.Dorf_01) speichern müsste, was bei guten Hundert Variablen enormer Schreibaufwand wäre. Kennt jemand vllt. Eine bessere Lösung? Aber bitte habt Verständnis, wenn ich euch öfters frage, den ich bin noch nicht sonderlich gut. Danke schon mal für eure Antworten,
alex41018

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

2

03.08.2013, 20:42

Was willst du denn genau erreichen? möchtest du einfach alle klassen die du hast hintereinander speichern? Dann darfst du die datei nicht jedes mal neu aufmachen, denn das führt dann dazu, dass die datei überschrieben wird.
(Wenn du an eine datei diirekt nach dem öffnen etwas anhängen möchtest kannst du

C-/C++-Quelltext

1
fstream output("Dorf.txt", ios::biary | ios::trunc);
verwenden

Gelöschter Benutzer

unregistriert

3

03.08.2013, 21:56

Wenn ich das richtig verstanden habe, dienen die Klassen auch dazu, Variablen zu deklarieren. Diese Deklarierten Variablen werden dann ja mal definiert, und diese Definition möchte ich nach einer "Veränderung" (z. B. wenn Dorf zerstört wurde => Dorf = 0) speichern. Wenn ich das Spiel beende und dann neu starte, soll das Dorf weiterhin den Wert 0 haben, obwohl am Anfang Dorf mit 1 definiert wurde, also lade ich meinen Spielstand, welcher aus den gespeicherten Werten besteht (z. B. Dorf = 0). Jetzt geht es darum, wie ich das möglichst kurz mache, da es sehr viele Variablen sind. Wenn man einfach Dorf = 1 speichert, wird sowohl Mensch.Dorf = 1 und Gegner.Dorf = 1. Wie kann ich das umgehen?

4

03.08.2013, 22:34

Liefere uns doch einfach mal ein lauffähiges Minimalbeispiel (in Code-Tags bitte, bei ausschweifenden Quelltext darf es auch ein pastebin sein).

Hier liegt wohl einiges im Argen und wir zerfleischen gerne Code-Fetzen.

Grüße ... bwbg

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

5

04.08.2013, 09:31

Ich vermute, dass man die Variablen "einzeln" (z. B. Mensch.Dorf_01) speichern müsste, was bei guten Hundert Variablen enormer Schreibaufwand wäre.
Selbst wenn, 100x Output1.write ((char*) &Dorf_01, sizeof (Dorf_01)); schreiben, das dauert vielleicht ne Stunde. Lachhaft also im Vergleich zu einem gesamten Projekt, dafuer hat man dann aber volle Kontrolle, welche Sache gespeichert werden, und welche unnuetz sind. Ich verstehe daher nicht den Sinn, das du das "moeglichst kurz" haben moechtest. Ich wuerde dir empfehlen fuer den Anfang sowas wie tinyXML zu benutzen und dann dem Dorf usw. Methoden gibst, womit es in die xml Datei geschrieben oder gelesen wird.

Gelöschter Benutzer

unregistriert

6

04.08.2013, 10:32

@TGGC: Danke, ich denke so werde ich es dann machen :)

@bwbg:
#include <iostream>
#include <fstream>
#include "Header.hpp"
using namespace std;
int main ()
{
int Speichern = 0;
do
{
//Speichern gibt an, ob ein Spielstand vorhanden ist oder nicht
C_Gebaeude Mensch;
C_Gebaeude Gegner;
ifstream Input2 ("Speichern.spc", ios::binary); Input2.read ((char*) &Speichern, sizeof (Speichern)); Input2.close ();
if (Speichern == 1)
{
cout << "Dorf_01 Mensch ";
Mensch.lade_Dorf_01 ();
cout << "Dorf_01 Gegner ";
Gegner.lade_Dorf_01 ();
cout << "aktuelle Daten" << endl;
Mensch.zeigeDaten ();
}
//Während Spiel ändert sich der Zustand des Dorfes (0) vom Menschen
cout << "Mensch.Dorf_01 wird von 1 zu 0 oder von 0 zu 1" << endl;
Mensch.aendere_Dorf_01 ();
cout << "aktuelle Daten" << endl;
Mensch.zeigeDaten ();
//das Dorf des Gegners bleibt aber weiterhin 1
//
//Nun werden die Spielstände gesichert
Speichern = 1;
ofstream Output2 ("Speichern.spc", ios::binary); Output2.write ((char*) &Speichern, sizeof (Speichern)); Output2.close ();
Mensch.sichere_Dorf_01 ();
Gegner.sichere_Dorf_01 ();
Mensch.zeigeDaten ();
cin.get ();
}while (Speichern == 1);

}
#include <iostream>
#include <fstream>
#include "Header.hpp"
using namespace std;
C_Gebaeude::C_Gebaeude ()
{
Dorf_01 = 1;
}
void C_Gebaeude::aendere_Dorf_01 ()
{
if (Dorf_01 == 1)
{
Dorf_01 = 0;
}
else if (Dorf_01 == 0)
{
Dorf_01 = 1;
}
cout << "Dorf_01 geaendert!" << endl;
}
void C_Gebaeude::sichere_Dorf_01 ()
{
ofstream Output1 ("Dorf_01.drf", ios::binary); Output1.write ((char*) &Dorf_01, sizeof (Dorf_01)); Output1.close ();
cout << "Dorf_01 gesichert!" << endl;
}
void C_Gebaeude::lade_Dorf_01 ()
{
ifstream Input1 ("Dorf_01.drf", ios::binary); Input1.read ((char*) &Dorf_01, sizeof (Dorf_01)); Input1.close ();
cout << "geladen!" << endl;
}
void C_Gebaeude::zeigeDaten ()
{
C_Gebaeude Mensch;
C_Gebaeude Gegner;
cout << "Mensch.Dorf_01 = " << Mensch.Dorf_01 << endl;
cout << "Gegner.Dorf_01 = " << Gegner.Dorf_01 << endl;
}
class C_Gebaeude
{
private:
int Dorf_01;
public:
C_Gebaeude ();
void aendere_Dorf_01 ();
void sichere_Dorf_01 ();
void lade_Dorf_01 ();
void zeigeDaten ();
};

vermutlich habe ich irgendwas falsch gemacht, den die Funktion aendere_Dorf_01 will nicht gehen. bitte bedenkt aber das ich absoluter anfänger bin :)

7

04.08.2013, 12:52

Naja, deine Funktion zeigeDaten() macht ein paar komische Sachen. Du erzeugst da zwei neue Objekte, gibst die Daten aus und zerstörst sie gleich wieder. Was du brauchst, ist eine globale Funktion, der du die beiden Objekte übergibst.

void zeigeDaten( gebäude1, gebäude2);

Oder eine Elementfunktion die also nur die Daten eines Objekts ausgibt.

gebäude1.zeigeDaten();
gebäude2.zeigeDaten();

Gelöschter Benutzer

unregistriert

8

05.08.2013, 14:34

Danke für eure Antworten

Gelöschter Benutzer

unregistriert

9

06.08.2013, 21:23

Mal noch ne ganz andere Frage (passt zwar nicht in Thread, aber da dieser sowieso schon beendet ist und ich für so eine frage keinen neuen aufmachen will): Ist es möglich in einer exe-Anwendung einzelne Abschnitte (cout << "Beispiel" << endl;) farbig darzustellen?

FSA

Community-Fossil

  • Private Nachricht senden

10

06.08.2013, 21:32

*nicht hauen*
system("color 9e");
Und dann dein cout.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige