wie geschickt speichern und laden.

19/12/2013 - 13:09 von Hermann Riemann | Report spam
Gegeben

struct file_{
char *name;
int last,next,dir_nr;
size_t file_len;
time_t tm;};

struct file_ *file_list;
int nr_of_files;
char buf[1024];

Dieses möchte ich abspeichern
und bei einem neuen Programmaufruf wieder laden.

Wenn kein *_t dabei wàre
würde ich
fprintf("%d %d %d %s",f->last,f->next,f->dir_nr,f->name);
verwenden.
Für size_t und time_t kenne ich kein Format.
Vermute aber, dass die Làngen sich mal àndern könnten.
Wenn ich das ganze Feld mit write ausgeben
stimmen zwar beim lesen size_t etc,
aber char * zeigt wahrscheinlich nicht auf brauchbare Texte.

Momentan sehe ich 3 Alternativen:

1:
Umwandlung in hexstrings:
static void to_buf(unsigned char *in_p int l){
int i;
for (i=0;i<l;i++) sprintf(&g.buf[i],"%2X",in_p++);
buf[l]='\0';}
mit und to_buf((char *)&f->tm,sizeof(struct tm));
fprintf(f,"%s ",buf); etc,
und beim Lesen die Hex-Umkehrung.

2:
binàres Schreiben mit getrennte Dateien:
struct file_{
union {
char *name;
long name_offset;};
int ..

size_t len;
len=nr_of_files /* für \0 */ + Laenge_aller_Namen
Und ein ein p=malloc(len)
Umkopieren der Namen (offset sichern)
und dann beide Dateien mit write rausschreiben.

3. Alternative:
Umwandlung nach int64_i bzw
{ union
size_t file_len;
int64_i file_len_64;};
und dann mit dem Format %ld rausschreiben.

Hermann
der das Programm nicht gerne in 5 Jahren àndern mag,
und ein char[sizeof(struct igendwas)] vermisst.

http://www.Hermann-Riemann.de
 

Lesen sie die antworten

#1 Jens Schweikhardt
19/12/2013 - 17:59 | Warnen spam
Hermann Riemann wrote
in :
...
# Hermann
# der das Programm nicht gerne in 5 Jahren àndern mag,
# und ein char[sizeof(struct igendwas)] vermisst.

Was heißt vermissen? Dass es in C so nicht kompiliert? Doch, tut es.

Zeiger in Strukturen gelten aber immer nur im gerade ausgeführten
Programm. Bei Zeigern muss man das adressierte Objekt speichern. Bei
strings also die Zeichenkette.

(Allgemein nennt sich Dein Vorhaben "Serialisierung".)

Regards,

Jens
Jens Schweikhardt http://www.schweikhardt.net/
SIGSIG -- signature too long (core dumped)

Ähnliche fragen