Запись структуры, содержащей динамический массив, в двоичный файл (C) - PullRequest
0 голосов
/ 27 ноября 2018

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

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

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

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

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

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

Лучшее решение этого было бы объявить 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 Ответ

0 голосов
/ 27 ноября 2018

Следующий пример создает, записывает и читает ваши данные.Это просто набросок.Проверка ошибок на 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++;
    }
}
...