此问题已在此处有答案:
How to read / write a struct in Binary Files?(2个答案)
1年前关闭。
我在将一个包含“许多变量”的结构体写入二进制文件(作为临时文件)以便在其他模型中(当需要时)以相同的结构体格式(structpreprocessing_variables)读取时遇到了一些困难
我的struct如下:
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;
}
子结构:
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);
}
1条答案
按热度按时间kkbh8khc1#
我建议使用flat buffer或google protobuf,如果你想交换企业应用程序中格式化的强数据。
它们都可以将你的类序列化为二进制,并在另一个程序中反序列化你的类。
如果您在选择它们时犹豫不决,可以看到What's the difference between Protocol Buffers and Flatbuffers?