Невозможно записать структуры с переменными размерами в двоичный файл, а затем снова прочитать их без записи их размера.Вы можете либо использовать массив символов с фиксированным размером вместо указателя символа, либо использовать пользовательский формат файла, в котором вы записываете размер каждого элемента, если вам нужно, чтобы они были переменной длины.
Поскольку у меня не было ничего лучше, я написал небольшую программу, которая, я надеюсь, сделает то, что вы ищете.Нет проверки ошибок:)
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct {
int offset;
int length;
char *data;
} log_record;
void write_to_file(const char *filename)
{
log_record lr;
const int num_records = 10;
char buf[100];
int i;
FILE *fp;
fp = fopen(filename, "wb");
for(i = 0; i < num_records; ++i)
{
sprintf(buf, "Data entry %d goes here. Beware of size limit!", i);
lr.length = strlen(buf) + 1;
lr.offset = i;
lr.data = malloc(sizeof(char) * lr.length);
strncpy(lr.data, buf, lr.length);
fwrite(&lr.offset, sizeof(lr.offset), 1, fp);
fwrite(&lr.length, sizeof(lr.length), 1, fp);
fwrite(lr.data, sizeof(char), lr.length, fp);
free(lr.data);
}
fclose(fp);
}
void read_from_file(const char * filename)
{
log_record lr;
int tmp;
FILE *fp;
fp = fopen(filename, "rb");
while (feof(fp) == 0)
{
tmp = fgetc(fp);
if(tmp != EOF)
{
ungetc(tmp, fp);
fread(&lr.offset, sizeof(int), 1, fp);
fread(&lr.length, sizeof(int), 1, fp);
lr.data = malloc(sizeof(char) * lr.length);
fread(lr.data, sizeof(char), lr.length, fp);
free(lr.data);
}
}
fclose(fp);
}
int main(int argc, char *argv[])
{
write_to_file("temp.bin");
read_from_file("temp.bin");
return 0;
}