我正在编写一个程序,该程序将数组及其有关的信息写入二进制文件。
我的第一种方法是调用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文件中的数据仍然不正确。
是否可以使用结构来解决此问题?还是我应该像一开始那样坚持将数组写入文件中?
答案 0 :(得分:0)
以下示例创建,写入和读取您的数据。这只是一个轮廓。省略对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++;
}
}