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

1

03.09.2009, 15:06

Segfault beim Speichern eines Structs in Datei

hallo leute.

ich will ein struct mit 3 members (int,string, bool)
in eine datei schreiben. aber ich bekomme immer einen segfault.
ich hab dann auch im buch: c++ für spieleprogrammierer nachgeschaut und da stehts gleich drin. nur das im buch eine klasse und kein struct geschrieben wird.

also hier der code:

C-/C++-Quelltext

1
2
3
4
5
6
std::fstream file;

file.open("anthem.game",std::ios::binary);
file.write((char*) &savedats, sizeof(savedats));

file.close();

was is denn falsch an dem code fetzen?

lg

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

2

03.09.2009, 15:19

an sich nichts, außer dass die deklaration von der struktur fehlt.

der segfault könnte vom laden kommen, beim speichern sollte nichts
passieren. (wenn du aber einen std::string direkt einliest, ist der
interne zeiger ungültig)

edit: jeah 300! jubiläum!
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

3

03.09.2009, 15:25

Wieso wollen so viele Leute binär schreiben? Das hat etliche Nachteile. Dass das im Buch empfohlen wird, halte ich ehrlich gesagt für keine so gute Idee.

Überlade dir einen ordentlichen operator>> oder eine andere Funktion für deine Klasse, mit der du semantisch speichern kannst. Das hat den Vorteil, dass du portabel bleibst und die gespeicherten Dateien auch nach einer Änderung deiner Klasse noch einen Nutzen haben. Ausserdem gibst du damit nicht nur das Bitmuster selbst aus, sondern auch referenzierten Speicher, wie er zum Beispiel innerhalb von std::string vorkommt.

P.S. struct ist eine Klasse.

4

03.09.2009, 17:13

naja aber ich hab da ein problem. ich habe wie gesagt einen int, dann nen string und dann nen bool wert. also mehr oder weniger auch nen int.

und ich hab zerst nicht binär gespeichert und da is dann in der datei zum bsp: 300aly1 gestanden. und ich weiß aber nicht wei ich das trennen kann, dass der 1er von der bool variable als string mitgezählt wird. der string hat variable größe... wie könnt ich das denn angehn?



lg

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

03.09.2009, 17:29

Du musst das ganze lediglich mit Abständen trennen. Sprich du solltest dann im File das hier haben:
300 aly 1

Wenn du das dann so einliest:

C-/C++-Quelltext

1
2
3
4
5
6
7
std::ifstream in ("file.txt");

int n = 0;
std::string s;
bool b;

in >> n >> s >> b;


Dann klappt das wunderbar.

(Dafür kannst du ja den << und >> Operator überladen, damit die du lediglich noch dein Objekt so ausgeben musst und er dann die einzelnen Werte selbst ausgibt, respektive einliest).

6

03.09.2009, 17:33

Du schreibst dir wie gesagt eine Ausgabefunktion. Ich nehme für das Beispiel mal den Stream-Operator <<.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <ostream>
#include <string>

struct MyStruct // sollte Konstruktoren besitzen!

{
    int i;
    std::string s;
    bool b;
};

std::ostream& operator<< (std::ostream& Stream, const MyStruct& Struct)
{
    Stream << Struct.i << '|' << Struct.s << '|' << Struct.b << std::endl;
    return Stream;
}

Ich habe die einzelnen Member durch die Pipe | getrennt und am Schluss eine neue Zeile eingefügt.

7

03.09.2009, 17:41

Du kannst XML benutzen. Damit kann man Dateien sehr schön strukturieren.

Ich bin auch sehr für Textdateien. Wenn man in einer Config-Datei mal schnell einen Wert ändern will, ist das bei Textdateien kein Problem. Bei binär schon.
Außerdem kann man, solange man sie halbwegs gescheit aufbaut, Textdateien auch in 10 Jahren noch lesen und häufig einen Loader schreiben, anhand einer Datei und ohne Spezifikation.

Ich benutze halt ticpp um XML Dateien zu lesen, klar kann der nicht alles, was XML kann ist aber ziemlich gut, prinzipiell.

Natrlich sind Textdateien etwas größer und es dauert auch länger, "Health" zu interpretieren, als einen Integer, der intern eben für Health steht. Aber dafür weiß man auch, wenn man die Datei lädt, dass man gerade das richtige ausliest und nicht versehentlich eine Position als Healthwert interpretiert.

Geschwindigkeit und speicher sind heute nicht mehr so wichtig, aber dass du eine robuste und einfach zu lesen und schreibende Datei hast, die in 10 Jahren eben kein wertloser Datenmüll mehr ist, das hat schon was.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

03.09.2009, 17:46

Zitat von »"Nexus"«

Wieso wollen so viele Leute binär schreiben? Das hat etliche Nachteile.


Aber auch genauso Vorteile. z.B. ist es meist effizienter im Sinne von braucht weniger Speicherplatz und ist schneller zu lesen/schreiben.

Zitat von »"AlymcGeel"«

ich habe wie gesagt einen int, dann nen string und dann nen bool wert.


Der String ist evtl. auch dein Problem: Du kannst nicht einfach ein string Objekt (oder vielleicht einen einfachen char*, kommt auf das gleiche Problem raus) in die Datei schreiben. Dein string Objekt enthält nur einen Pointer auf den Speicherbereich wo der string liegt, wenn du den speicherst steht in der Datei lediglich die Adresse wo der string im Speicher liegt. Allerspätestens beim nächsten Programmstart is diese Adresse komplett wertlos und ein Zugriff drauf macht bumm...

Zitat von »"Jonathan_Klein"«

Geschwindigkeit und speicher sind heute nicht mehr so wichtig, aber dass du eine robuste und einfach zu lesen und schreibende Datei hast, die in 10 Jahren eben kein wertloser Datenmüll mehr ist, das hat schon was.


Das kommt immer drauf an was du speichern willst. Bei config Dateien etc. würd ich auch ein Textformat nehmen. Aber ein 10000x10000 Pixel Bild würd ich nicht unbedingt in XML speichern wollen...

C--

Alter Hase

Beiträge: 465

Beruf: Schüler

  • Private Nachricht senden

9

03.09.2009, 17:47

Jonathan klein: Bin voll deiner Meinung, auch wenn ich mich mit Xml bisher nur unter .Net befasst hab.
Ich spreche: C/C++, C++/CLI C#, VBA, VB.NET, Delphi, (HTML, Javascript(bisschen))
------------------------------------------------------------
Hier steht eventuell schon in ein paar Monaten der Link zu meiner Homepage!

return 0;
;)

10

03.09.2009, 18:08

danke für die antworten. werd vorerst mal einfach leerzeichen reingeben und mich dann mit xml beschäftigen...

lg

Werbeanzeige