Pointer innerhalb einer struct in Datei schreiben
-
Hallo zusammen,
ich schreibe gerade an einem abgemagerten Dateiverwaltungssystem, dass Dateien in eine bestimmte Datei (im Folgenden VFS) einfügt und bei Bedarf wieder ausgibt.
Hierzu schreibe ich in eine andere Datei benötigte Verwaltungsdaten, vor allem Name und Größe der hinzuzufügenden Dateien, dies in Form einer struct.struct file { char *name; uint64_t size; };
Im Folgenden ist f eine eben solche struct.
Da ich vorher nicht weiß, wie lang der Name der Dateien ist, wollte ich name gerne als Pointer handhaben, dessen Größe ich später alloziiere.
f->name=malloc(strlen(target)); strcpy(f->name, target);
target entspricht dabei dem Namen der hinzuzufügenden Datei.
Bis hierhin funktioniert auch alles wie gedacht.
Nachdem die Datei dann dem VFS hinzugefügt wurde schreibe ich die struct in die Verwaltungsdatei.fwrite(f, sizeof(*f), 1, fstructure);
fstructure ist der Pointer auf die geöffnete Verwaltungsdatei.
Bei einem weiteren Programmdurchlauf lasse ich die struct wieder auslesen.f=(struct file *) malloc(s->sizef); fread(f, s->sizef, 1, fstructure);
s->sizef ist hierbei Element einer anderen struct, in dem ich die Größe von *f reingeschrieben habe.
Ab jetzt löst ein Zugriff auf f->name allerdings nur noch einen Speicherzugriffsfehler auf.
Ich vermute mal, dass das Problem darin liegt, dass ich in die Datei nur den Pointer, nicht aber den Inhalt des Pointers reinschreiben lasse und somit der Pointer auf irgendeinen blödsinnigen Speicherbereich zeigt.Wie kann ich das umgehen? Gibt es eine Möglichkeit, auch den Inhalt des Pointers mit in die Datei einzuschreiben?
Vielen Dank schon mal im Voraus.
-
Deine Vermutung ist richtig. Du darfst eben kein stumpfes fwrite benutzen, sondern musst deine Daten irgendwie formatiert ausgeben. Um zu erkennen, wo ein Dateiname aufhört, böte sich an, irgendein Trennzeichen zu benutzen, zum Beispiel ein '\0'.
-
struct file { char name[FILENAME_MAX+1]; uint64_t size; };
Sinnvolles Daten-Design schützt oft vor unsinnigem Code.
-
dez schrieb:
f->name=malloc(strlen(target)); strcpy(f->name, target);
target entspricht dabei dem Namen der hinzuzufügenden Datei.
Bis hierhin funktioniert auch alles wie gedacht.Nicht wirklich, es sollte schon
strlen(target) + 1
sein, sonst zerschießt es dir nur mit Glück nicht den Heap.
-
dez schrieb:
f->name=malloc(strlen(target)); strcpy(f->name, target);
Platz für Stringterminator vergessen!
-
Wutz schrieb:
struct file { char name[FILENAME_MAX+1]; uint64_t size; };
Sinnvolles Daten-Design schützt oft vor unsinnigem Code.
Aber jedes Mal den kompletten Namen rausschreiben? Ein FILENAME_MAX muss auf üblichen Dateisystemen mindestens mehrere Dutzend kB sein, wenn es den Pfad beinhaltet. Das wäre doch arg verschwenderisch. Wenn man diese Technik benutzt (was durchaus nicht verkehrt ist), muss man auch noch eine Ordnerstruktur implementieren, damit FILENAME_MAX wirklich nur ein paar hundert Bytes sind, was ein üblicher Wert für den Dateinamen alleine wäre.