Sto tentando di salvare una struttura con una stringa char * in un file.Salvataggio di una struttura C con una stringa char * in un file
struct d_object {
int flags;
int time;
int offset;
char *filename;
};
Il problema è che quando lo faccio, ovviamente, salverò solo l'indirizzo di quel puntatore anziché la stringa. Quindi quello che ho fatto è semplicemente usare un array di caratteri e sono costretto a impostare la dimensione massima della stringa. Funziona bene, tuttavia mi stavo chiedendo se è comunque possibile memorizzare la struttura con un char * (che io malloc ad un certo punto) in un file e quindi recuperarlo. Posso salvare la stringa e la struct separate e poi recuperarle ma è un bel casino. Sarebbe preferibile caricare e salvare l'intera struttura (quella sopra) nel file. Grazie!
Il codice con l'array di caratteri è qui sotto:
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
struct d_object {
int flags;
int time;
int offset;
char filename[255];
};
int main(int argc, char **argv) {
struct d_object fcb;
fcb.flags=5;
fcb.time=100000;
fcb.offset=220;
strncpy(fcb.filename,"myfile",255);
int fd=open("testfile",O_RDWR);
write(fd,&fcb,sizeof(fcb));
close(fd);
int fd2 = open("testfile",O_RDONLY);
struct d_object new_fcb;
read(fd2,&new_fcb,sizeof(new_fcb));
printf("read from file testfile: %s\n",new_fcb.filename);
return 0;
}
P.S .: Non sto utilizzando le funzioni di flusso, semplicemente perché questo è in realtà pensato per essere eseguito su un sistema operativo embedded che non li hanno. Ho appena adattato il codice per * BSD/Linux, quindi ha più senso quando si pone la domanda.
Il modo in cui stai usando fread è molto sbagliato. Non si dichiara un buffer di caratteri e non si legge in esso, quindi puntare un puntatore di struct su di esso. Basta dichiarare una struct e passare il puntatore a quella struttura da battere. Il modo in cui lo hai fatto non è valido C ed è probabile che si blocchi sulle architetture RISC con requisiti di allineamento rigorosi. –
ok, grazie per quello. Tuttavia questo non è il problema principale al momento. – theprole