структура с дампом памяти связанного списка - PullRequest
0 голосов
/ 14 августа 2010

Есть ли какой-нибудь стандартный подход, который я пропустил в школе, чтобы создать разумную структуру C со вложенными связанными списками на диске? То, что я не хочу делать, это:

  • использовать протокол-буферы или любые другие подобные сериализаторы,
  • не хочу создавать JSON, XML или другие

У меня мало идей:

  • выделять точный объем памяти (или расширять существующий) и управлять им самостоятельно, помещая элементы списка в стек, как подход, используя некоторые дополнительные поля для управления относительными адресами. При необходимости выгрузите блок на диск. Наличие процедур для сопоставления блока с диска создает желаемую структуру с учетом порядка байтов.
  • передать основную структуру в файл, затем нажать элементы списка, сохранить информацию о списке в заголовке файла.

Чтобы представить это, я приведу некоторые подробности, разместив пример кода:

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

веселит П.

EDIT:

Я расширил основную структуру, похоже, предыдущая не указала проблему полностью. Я знаю, что указатели на диске бесполезны. Идеи и псевдокод разрешены.

Ответы [ 3 ]

2 голосов
/ 14 августа 2010

Я не правильно понял вашу проблему, но выгрузка структуры на диск и ее надежное чтение имеет много проблем.

Наиболее важным является заполнение структуры или заполнение байтами. Таким образом, вы также должны позаботиться об этом.

1 голос
/ 14 августа 2010

Нет аккуратного способа сделать это, так как у них будут адреса памяти, и в следующий раз, когда он будет прочитан, он будет содержать адреса памяти, которые могут быть недействительными ... единственное, что вы можете сделать, это иметь удержаниеобласть для данных для чтения / записи, давайте посмотрим, как записать данные на диск на основе содержимого связанного списка ...

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

и заполнить 'rwBufferData' до записи, используяmemset и memmove

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

Теперь вы можете записать rwBuf в файл ... Я оставлю обратную операцию как упражнение ...

0 голосов
/ 14 августа 2010

Сериализация данных в порядке их хранения в связанном списке в стиле записи в файл.fwrite особенно хорош для этого.Обязательно разыменовывайте указатели и помните, какую роль в этом играет порядок байтов.

Вот некоторый расплывчатый псевдокод:

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

Грубый код для считывания в живой список:

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

Если вы начнете вкладывать более сложные структуры, такие как другие связанные списки, строки переменной длины и т. Д., Вам потребуется предоставить типы и длины для каждой записи, а также способВложите записи в другие записи.

Например, если в вашем связанном списке верхнего уровня есть элемент данных, который был другим списком, лучше всего сохранить этот элемент как вложенную запись, дополненную длиной,и введите поле.В качестве альтернативы вы можете определить записи часового типа, такие как \0 для символьных строк (очевидный выбор) и обнуленные блоки для структурных данных.

...