fwrite
-
Wenn ich ein Struct *p habe und dieses binär in eine Datei schreiben möchte dann schreibe ich doch:
fwrite(p,sizeof(Struct),1,dest);
jedoch schreibt er mir nur die Werte die im Struct sind in die Datei (bis auf Integer die schreibt er binär).
Ist da was falsch bzw. verstehe ich das falsch?
LG
-
Du darfst nicht einfach das Struct so in die Datei schreiben. Du musst Element für Element in die Datei schreiben.
-
movco schrieb:
Wenn ich ein Struct *p habe und dieses binär in eine Datei schreiben möchte dann schreibe ich doch:
fwrite(p,sizeof(Struct),1,dest);
jedoch schreibt er mir nur die Werte die im Struct sind in die Datei (bis auf Integer die schreibt er binär).
Ist da was falsch bzw. verstehe ich das falsch?
LGIch kann deine Frage nicht ganz verstehen. Der fwrite-Aufruf speichert die Werte des struct binär in die Datei. Das hat nichts damit zu tun ob die Member nun int oder sonstwas sind.
Janjan schrieb:
Du darfst nicht einfach das Struct so in die Datei schreiben. Du musst Element für Element in die Datei schreiben.
Das glaube ich nicht.
-
Tim schrieb:
Janjan schrieb:
Du darfst nicht einfach das Struct so in die Datei schreiben. Du musst Element für Element in die Datei schreiben.
Das glaube ich nicht.
Es stimmt aber. Die Elemente einer Struktur hängen nicht an einem Stück im Speicher. Zwischen den einzelnen Elementen kann der Compiler Paddings einfügen, wie es ihm beliebt, damit die Struktur besser zu handhaben ist für die Architektur. Dieses Padding ist eben abhängig vom Compiler und der Architektur. Daher ist das direkt einlesen in Strukturen nicht portabel.
-
Es gibt aber schon noch einen Unterschied zwischen "nicht portabel" und "du darfst nicht".
Edit: im übrigen würde es nicht helfen jedes Element einzeln zu schreiben weil das ebenso nicht portabel wäre.
-
Es ist undefiniertes Verhalten und sollte somit nicht benutzt werden.
-
Janjan schrieb:
Du darfst nicht einfach das Struct so in die Datei schreiben. Du musst Element für Element in die Datei schreiben.
das kommt ein bischen darauf an, es kann auch schneller sein. kann man evtl. ein bischen mit db-systemen CHAR und VARCHAR vergleichen bei dem char einen konstanten speicher verbrauch hat und varchar nur soviel wie benötigt, allerdings kanns dann mit dem index vorbei sein...
um mal das geschwafle sein zu lassen und ein konkretes beispiel zu liefern.
man stelle sich vor man legt in einer datei 10 structs abstruct persons{ char name[30]; char geschlecht[20]; int alter; }
jetzt kann man natürlich immer direkt zu dem stuct springen das man haben will
vergleichbar mit einem arrayfseek(fp,(sizeof(struct persons)*x),SEEK_SET);
hätte man ein struct
struct persons{ char *name; char *geschlecht; int alter; }
und würde element für element in die datei schreiben so müsste man alle elemente bis zum ziel durchlaufen, was einer verketteten liste gleich kommt.
array O(1) vs. Linked list O(n)
ach das ist wie immer total blöd zu erklären
lg lolo
-
Wieso jetzt auf einmal undefiniertes Verhalten?
-
Janjan schrieb:
Tim schrieb:
Janjan schrieb:
Du darfst nicht einfach das Struct so in die Datei schreiben. Du musst Element für Element in die Datei schreiben.
Das glaube ich nicht.
Es stimmt aber. Die Elemente einer Struktur hängen nicht an einem Stück im Speicher. Zwischen den einzelnen Elementen kann der Compiler Paddings einfügen, wie es ihm beliebt, damit die Struktur besser zu handhaben ist für die Architektur. Dieses Padding ist eben abhängig vom Compiler und der Architektur. Daher ist das direkt einlesen in Strukturen nicht portabel.
nein, es ist unportabel für schnittstellen und protokolle. für z.b. programm eigene files oder cache files die nach beenden wieder gelöscht werden, bzw. nicht zwischen programmen ausgetauscht werden sollen ist das ganz toll;)
lg lolo
-
Janjan schrieb:
Daher ist das direkt einlesen in Strukturen nicht portabel.
Aber das "Element für Element schreiben", was du vorschlägst, ist auch nicht viel portabler, wenn die Struktur nicht nur aus chars besteht.
-
noobLolo schrieb:
fseek(fp,(sizeof(struct persons)*x),SEEK_SET);
Huh, was ist denn das?
-
mngbd schrieb:
noobLolo schrieb:
fseek(fp,(sizeof(struct persons)*x),SEEK_SET);
Huh, was ist denn das?
Was stimmt denn damit nicht?
-
namespace invader schrieb:
Was stimmt denn damit nicht?
1. Warum nicht
sizeof(struct persons)
?
2. Finde ich gerade keinen Compiler, der das verstehen will.
-
Da war ich wieder schön verwirrt, Tim hat mir's erklärt. Die letzen beiden Posts waren natürlich Blödsinn.
-
movco schrieb:
Wenn ich ein Struct *p habe und dieses binär in eine Datei schreiben möchte dann schreibe ich doch:
fwrite(p,sizeof(Struct),1,dest);
jedoch schreibt er mir nur die Werte die im Struct sind in die Datei (bis auf Integer die schreibt er binär).
Ist da was falsch bzw. verstehe ich das falsch?
LGWarum sollte da etwas falsch sein, weil du die Integer nicht im Texteditor lesen kannst?
Das ist normal, denn eine Integerzahl besteht im Gegensatz zu einer Zahl im Textformat nicht aus Bytesequenzen. Ein Texteditor ist auf Bytesequenzen angewiesen, darum erscheint eine im Binärformat gespeicherte Integerzahl im Editor als Datenschrott.
Lies doch die Werte mit fread wieder ein und las sie dir in der Konsole anzeigen. Dann siehst du, ob das Speichern erfolgreich war.Gruß,
B.B.