如何将复杂类型的结构体写入二进制并在另一个程序中以相同的结构体格式重新读取它们?



我在编写"多变量"结构体时遇到了一些困难。到一个二进制文件(作为临时文件),以相同的结构格式(struct preprocessing_variables)在其他模型中读取(当需要时)

结构如下:

struct preprocessing_variables{
parameters params;
obj_prop objprop;
griddf grid;
vector<time_t long long> timevec;
landmask lmdomain;
data3D w1_array;
data3D w2_array;
data3D w3_array;
vector<int> orientation;
position pos;
cross_wind crosswind;
}

Sub-structs:

struct parameters {
int N, radius, t_sum, obj;
double  dt;
string t0;
float lon0, lat0, lonn, latn,x0, y0, dl;
};
struct landmask {
vector<vector<double>> value;
};
struct data3D {
vector<vector<vector<double>>> u;
vector<vector<vector<double>>> v;
};
struct position{
vector<float> x;
vector<float> y;
};
...

我想把它们都写进一个二进制文件。我所做的有点笨重,代码中有一些错误。我也想化简这段代码。请帮帮我!我很感激。

void save_preprocessing(preprocessing_variables prevars){
const char* filename="preprocessing.data";
FILE *outfile;
if(outfile= fopen(filename,"wb")) fclose(outfile);
remove(filename);
outfile= fopen(filename,"wb");
fwrite(&prevars.params,sizeof(prevars.params),1,outfile);
fwrite(&prevars.objprop,sizeof(prevars.objprop),1,outfile);
fwrite(&prevars.grid,sizeof(prevars.grid),prevars.grid.lat.size(),outfile);
fwrite(&prevars.timevec,sizeof(prevars.timevec),prevars.timevec.size(),outfile); 
fwrite(&prevars.lmdomain,sizeof(prevars.lmdomain),prevars.lmdomain.value.size(),outfile);
fwrite(&prevars.w1_array,sizeof(prevars.w1_array),prevars.w1_array.u.size(),outfile);
...
fwrite(&prevars.orientation,sizeof(prevars.orientation),prevars.orientation.size(),outfile);
fwrite(&prevars.pos,sizeof(prevars.pos),prevars.pos.x.size(),outfile);
fwrite(&prevars.crosswind,sizeof(prevars.crosswind),1,outfile);

fclose(outfile);
}

如果你想在企业应用程序中交换强数据格式,我建议使用flat buffer或google protobuf。

它们都可以将你的类序列化为二进制文件,并在另一个程序中反序列化你的类。

如果你犹豫在它们之间选择,你可以看到协议缓冲区和平面缓冲区之间的区别是什么?