fwrite
-
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.