Поле char *
вашей структуры известно как поле переменной длины . Когда вы пишете это поле, вам понадобится метод определения длины текста. Два популярных метода:
1. Первый размер письма
2. Написание терминального символа
Первый размер письма
В этом методе сначала записывается размер текстовых данных, а затем сразу же данные.
Преимущества: текст может загружаться быстрее при чтении блока.
Недостатки: требуется два чтения, для данных длины требуется дополнительное пространство.
Пример кода:
struct My_Struct
{
char * text_field;
};
void Write_Text_Field(struct My_Struct * p_struct, FILE * output)
{
size_t text_length = strlen(p_struct->text_field);
fprintf(output, "%d\n", text_length);
fprintf(output, "%s", p_struct->text_field);
return;
}
void Read_Text_Field(struct My_STruct * p_struct, FILE * input)
{
size_t text_length = 0;
char * p_text = NULL;
fscanf(input, "%d", &text_length);
p_text = (char *) malloc(text_length + sizeof('\0'));
if (p_text)
{
fread(p_text, 1, text_length, input);
p_text[text_length] = '\0';
}
}
Запись терминального символа
В этом методе текстовые данные записываются с последующим символом «терминал». Очень похоже на строку языка Си.
Преимущества: Требуется меньше места, чем Size First.
Недостатки: текст должен читаться по одному байту за раз, чтобы не пропустить символ терминала.
Поле фиксированного размера
Вместо использования char*
в качестве члена, используйте char [N]
, где N - максимальный размер поля.
Преимущества: записи фиксированного размера можно читать как блоки.
Облегчает произвольный доступ к файлам.
Недостатки: потеря пространства, если все пространство поля не используется.
Проблемы, когда размер поля слишком мал.
При записи структур данных в файл вам следует рассмотреть возможность использования базы данных . Есть маленькие, такие как SQLite, и большие, такие как MySQL. Не тратьте время на запись и отладку процедур постоянного хранения ваших данных, когда они уже записаны и протестированы .