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

jqjz2hbq  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(144)

此问题已在此处有答案

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);
}
kkbh8khc

kkbh8khc1#

我建议使用flat buffergoogle protobuf,如果你想交换企业应用程序中格式化的强数据。
它们都可以将你的类序列化为二进制,并在另一个程序中反序列化你的类。
如果您在选择它们时犹豫不决,可以看到What's the difference between Protocol Buffers and Flatbuffers?

相关问题