Вот один из способов решения проблемы.
Создайте структуру данных для элементов списка, например:
struct DictionaryArchive {
char key[MAX_KEY_LENGTH];
char value[MAX_VALUE_LENGTH];
int next;
};
Вам нужно будет определить значения MAX_KEY_LENGTH
и MAX_VALUE_LENGTH
в соответствии с данными, которые вы ожидаете.
Теперь, преобразуйте ваш связанный список в массив этих структур. Вместо того, чтобы хранить указатель для поиска следующего элемента, вы будете хранить индекс массива следующего элемента. Это преобразует ваш список в формат, в котором каждый элемент имеет предсказуемый размер, а весь список - один последовательный интервал памяти. Теперь вы можете fwrite
этот массив в двоичный файл для его архивирования и fread
его восстановление для его восстановления.
Гораздо более экономичная альтернатива использованию массивов фиксированного размера char
, указанным выше, - вместо этого определять собственный формат файла вместо использования статических структур. Для вашего случая вы можете использовать такой формат файла, чтобы хранить ваши данные в извлекаемой форме:
- Список записывается в файл по порядку, начиная с заголовка и следуя указателям
next
на хвост
- Каждый элемент списка будет сохранен с использованием четырех полей данных в следующем порядке:
- 16-разрядное целое число,
key_length
- 8-битный массив символов с
key_length
элементами, key_data
- 16-разрядное целое число,
value_length
- 8-битный массив символов с
value_length
элементами, value_data
Теперь вы можете просматривать список, выгружая ваши данные в файл узел за узлом. Чтобы восстановить ваши данные, прочитайте двоичный файл, сгенерируйте новые элементы struct Dictionary
для каждой записи и свяжите их вместе в порядке их появления в файле.
Ваш код для записи данных в файл данных будет выглядеть примерно так (непроверенный, только для иллюстрации):
FILE* fd;
size_t len;
struct Dictionary* pDict = list_head;
fd = fopen("output_file.dat", "w");
// Walk through the list, storing each node
while (pDict != NULL) {
// Store key
len = strlen(pDict->key);
fwrite(&len, sizeof(len), 1, fd);
fwrite(pDict->key, len, sizeof(char), fd);
// Store value
len = strlen(pDict->value);
fwrite(&len, sizeof(len), 1, fd);
fwrite(pDict->value, len, sizeof(char), fd);
// Move to next list node
pDict = pDict->next;
};
fclose(fd);
Ваш код для чтения данных будет очень похож (читайте вместо записи и создайте новый struct Dictionary
объект для каждой итерации цикла).