Domanda

c'è qualche approccio standard che ho perso a scuola per fare uscire C struttura con le liste nidificate collegate sul disco in modo ragionevole? Quello che non voglio fare è:

  • uso di protocollo-buffer o di qualsiasi altro come serializators,
  • non vogliono creare JSON, XML o altro

ho alcune idee:

  • allocare quantità di memoria accurata (o estendere uno esistente) e gestire da solo, ponendo elementi della lista in pila come approccio utilizzando alcuni campi aggiuntivi per gestire gli indirizzi relativi. Quando necessario blocco di dump sul disco. Avere procedure per mappare blocco dal disco creare la struttura auspicabile essere a conoscenza di Byte-ordine.
  • spingere struttura principale in un file, quindi spingere elementi List, memorizzano le informazioni circa l'elenco nell'intestazione di un file.

Per questa immagine darò qualche dettaglio in più distacco codice di esempio:

typedef struct{
   int b;
   List *next;
}List;

typedef struct{
   float b;
   List2 *next;
}List2;

typedef struct{
   List *head;
   List *tail;
} info;

typedef struct{
   List2 *head;
   List2 *tail;
} info2;

struct data
{
    int a;
    char t[10];
    info first;
    info second;
    info2 third;
};

applausi P.

Modifica

ho esteso struttura principale, sembra che quello precedente non hanno indicano completamente il problema. Sono consapevole del fatto che i puntatori sul disco sono inutili. Idee e pseudocodice ammessi.

È stato utile?

Soluzione

Serialize dati nell'ordine è tenuto nella lista collegata, record di stile in un file. fwrite è particolarmente buono per questo. Assicurati di puntatori dereference, ed essere consapevoli del ruolo svolto dallo endianness in questo.

Ecco qualche vaga pseudocodice:

List *list_new();
List *list_add(List *, void *data);
List *list_next(List *);

while (node) {
    fwrite(node->data, sizeof(node->data), 1, fp);
    node = list_next(node);
}

Codice di massima per la rilettura in un elenco dal vivo:

List *node = list_new();
while (true) {
    struct data *buf = malloc(sizeof(*buf));
    if (1 != fread(buf, sizeof(*buf), 1, fp))
        break;
    list_add(node, buf);
}

Update0

Se si inizia a nido strutture più avanzate, come altre liste collegate, le stringhe di lunghezza variabile, ecc, è necessario fornire i tipi e lunghezze per ogni record, e un modo per record nido all'interno di altri record.

Per fare un esempio, se l'elenco di livello superiore collegato aveva un membro di dati che è stato un altro elenco, devi essere migliore per conservare tale membro come un record nidificato, con tanto di lunghezza e tipo di campo. In alternativa, è possibile definire record sentinella, come \0 per stringhe di caratteri (una scelta ovvia), e blocchi azzerate per i dati struct.

Altri suggerimenti

Non ho capito il problema in modo corretto, ma il dumping una struttura a disco e leggerlo di nuovo in modo affidabile ha molteplici problemi.

La maggior parte un importante è la struttura imbottitura o ripieno di byte. Così si dovrebbe prendere cura di questo anche.

Non c'è modo pulito per fare questo, in quanto questi avranno indirizzi di memoria, e la prossima volta che viene letta, conterrà indirizzi di memoria che potrebbe essere valida ... l'unica cosa che si poteva fare è avere una partecipazione zona per dati da leggere / scrivere, diamo un'occhiata a come scrivere i dati su disco in base al contenuto della lista collegata ...

struct rwBufferData{
    int a;
    char t[10];
};

e riempire il 'rwBufferData' prima di scrivere utilizzando memset e memmove

struct rwBufferData rwBuf;
struct data *dataPtr;
memset(&rwBuf, '\0', sizeof(struct rwBufferData));
memmove(&rwBuf, dataPtr, sizeof(struct rwBufferData));

Ora si può quindi rwBuf scrittura al file di ... Lascio l'operazione inversa come esercizio ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top