Frage

Gibt es eine Standardmethode, die ich in der Schule verpaßt habe C Struktur mit verschachtelten verkettete Listen auf der Festplatte in angemessener Art und Weise zu entleeren? Was ich will nicht zu tun ist:

  • Verwendung Protokoll-Puffer oder jede andere wie serializators,
  • wollen nicht JSON erstellen, XML oder andere

Ich habe einige Ideen:

  • zuteilen genaue Speichermenge (oder bestehende erweitern) und zu verwalten, es selbst, platzieren Listenelemente in Stapel wie Ansatz einige zusätzliche Felder mit relativen Adressen zu verwalten. Bei Bedarf Dump-Block auf dem Datenträger. sich dessen bewusst zu Byte-Reihenfolge Verfahren abzubilden Blocks von der Platte erstellen wünschenswert Struktur.
  • drücken Hauptstruktur auf Datei, dann schieben Sie Listenelemente, speichern Informationen über die Liste in der Kopfzeile einer Datei.

Um das Bild dieses Ich werde ein paar mehr Details geben Beispielcode schreibt:

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;
};

prost P.

EDIT:

habe ich Hauptstruktur erweitert, scheint wie vorherige haben das Problem nicht vollständig angeben. Ich bin mir bewusst, dass Zeiger auf dem Datenträger unbrauchbar sind. Ideen und Pseudo-Code erlaubt.

War es hilfreich?

Lösung

Serialize die Daten in der Reihenfolge in eine Datei in der verknüpften Liste, Rekord-Stil gehalten ist. fwrite ist besonders gut für diese. Achten Sie darauf, zu dereferenzieren Zeiger, und sich bewusst sein, welche Rolle endianness spielt in diesem.

Hier ist etwas vage Pseudo-Code:

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);
}

Raute Code für zurück in eine Live-Liste zu lesen:

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

Wenn Sie nisten fortgeschritteneren Strukturen wie andere verkettete Listen, Zeichenfolgen variabler Länge usw. beginnen, müssen Sie Typen und Längen für jeden Datensatz liefern, und ein Weg, um Nest Aufzeichnungen innerhalb anderer Aufzeichnungen.

Als Beispiel, wenn Ihre Top-Level-verketteten Liste ein Datenelement hat, die ein andere Liste war, würden Sie am besten sein, das Mitglied zu speichern als verschachtelten Datensatz, komplett mit einer Länge und Typ-Feld. Alternativ können Sie Sentinel-Aufzeichnungen, wie \0 für Zeichenketten (eine offensichtliche Wahl) und Null gesetzten Blöcke für struct Daten definieren.

Andere Tipps

Ich habe verstanden, nicht Ihr Problem richtig, aber eine Struktur auf der Festplatte Dumping und wieder zuverlässig hat mehrere Probleme zu lesen.

Am wichtigsten ist Struktur Polsterung oder Byte-Füllung. Sie würden also auch davon kümmern müssen.

Es gibt keine nette Art und Weise, dies zu tun, da diese Speicheradressen haben, und das nächste Mal eingelesen wird, wird es Speicheradressen enthalten, die möglicherweise ungültig sein könnte ... das einzige, was Sie tun können, haben ist eine Holding Bereich für Daten gelesen / geschrieben, schauen wir uns an, wie sich die Daten auf die Festplatte zu schreiben, basierend auf dem Inhalt der verknüpften Liste ...

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

und füllt den 'rwBufferData' vor dem Schreiben von memset mit und memmove

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

Jetzt können Sie dann schreiben rwBuf auf Datei ... Ich werde den Rückwärtsbetrieb als Übung lassen ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top