将包含动态数组的结构写入二进制文件(C)

时间:2018-11-27 13:53:46

标签: c struct binaryfiles fwrite dynamic-arrays

我正在编写一个程序,该程序将数组及其有关的信息写入二进制文件。

我的第一种方法是调用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个字节,所以如果我要调用用struct_array fwrite文件中的数据仍然不正确。

是否可以使用结构来解决此问题?还是我应该像一开始那样坚持将数组写入文件中?

1 个答案:

答案 0 :(得分:0)

以下示例创建,写入和读取您的数据。这只是一个轮廓。省略对mallocfreadfwrite的错误检查:

#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++;
    }
}