Запись структуры, содержащей динамический массив, в двоичный файл (C)

Я пишу программу, которая записывает массивы и информацию о них в двоичный файл.

Мой первый подход состоял в том, чтобы вызывать fwrite 4 раза: один раз для общей информации о массиве, один раз для отметки времени, один раз для измерения массива и один раз для записи самого массива. Этот подход работал довольно просто, но время выполнения было слишком медленным, поскольку программа многопоточная и часто выполняет запись на диск SAS, заполняя диск запросами, которые представляли узкое место.

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

struct array_data{
    int information;
    int timestamp;
    int size;
    int* data_array;
}

Во время выполнения я записывал данные в буфер и, когда у меня было все, что нужно, вызывал malloc для выделения array_data.data_array и скопировать все из буфера из цикла for.

Проблема в том, что когда я вызываю fwrite для записи всей структуры, первые 3 члена структуры пишутся правильно, а массив - нет, и это связано с тем, что адрес массива не является смежным, поскольку он указывает на другое место в память после маллока.

Лучшее решение для этого было бы объявить data_array как статический массив, таким образом, fwrite будет работать так, как мне нужно, но тогда мне придется вызывать fwrite для каждой структуры, вместо того, чтобы вызывать его один раз, чтобы написать массив структуры, которые могут повлиять на производительность, отрицая использование структуры.

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

struct array_data{
    int information;
    int timestamp;
    int size;
    int data_array[];
}

и выделение массива структур с помощью malloc, но адрес struct_array[1].information не тот сразу после struct_array[0].data_array[last_index]Кажется, между ними есть еще 5 байтов, поэтому если бы я вызвал fwrite с struct_array, данные в файле все равно были бы неверными.

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

1 ответ

Следующий пример создает, записывает и читает ваши данные. Это просто набросок. Проверка ошибок на malloc, fread а также fwrite пропущены:

#define N_DATA 10
#define N_INTS 5

struct array_data{
    int information;
    int timestamp;
    int size;
    int* data_array;
};
struct array_data arr[N_DATA];

void makeData(void){
    int i;
    for (i=0;i<N_DATA;i++) {
        arr[i].data_array=malloc(N_INTS*sizeof(int));
        arr[i].size= N_INTS;
    }
}
void writeData(FILE *fp_out)
{
    int i;
    for (i=0;i<N_DATA;i++) {
        fwrite(&arr[i],sizeof(arr[i]),1,fp_out);
        fwrite(arr[i].data_array,arr[i].size*sizeof(int),1,fp_out);
    }
}
void readData(FILE *fp_in)
{
    int i= 0;
    while(fread(&arr[i],sizeof(arr[i]),1,fp_in)==1) {
        arr[i].data_array=malloc(arr[i].size*sizeof(int));
        fread(arr[i].data_array,arr[i].size*sizeof(int),1,fp_in);
        i++;
    }
}
Другие вопросы по тегам