Вопрос

Есть ли какой-либо стандартный подход, который я пропустил в школе, чтобы сбросить 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;
};

ура П.

РЕДАКТИРОВАТЬ:

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

Это было полезно?

Решение

Сериализировать данные в порядке, который он проводится в связанном списке, стиль записи в файл. 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.

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

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

Другие советы

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

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

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

struct rwbufferdata {int a; Char T [10]; };

и заполните «rwbufferdata» перед записью, используя memset и memmove

struct rwbufferdata rwbuf; Данные структуры * dataPtr; Memset (& rwbuf, ' 0', sizeof (struct rwbufferdata)); memmove (& rwbuf, dataPtr, sizeof (struct rwbufferdata));

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top