将向量向量结构的向量写入二进制文件

Writing a vector of vector vector structure to a binary file

std::vector<std::vector<std::vector<sphere_data> >> Sphere_image ; 

我想将球体图像中的数据写入二进制文件。

谁能告诉我这是怎么做到的。

我试过这个代码:

ofstream fout("C:/Project/data.dat", ios::out | ios::binary);
fout.write((char*)&Sphere_image[o], Sphere_image.size() *     
sizeof(sphere_data));
fout.close();

多维向量不像多维数组那样存储在连续的内存位置。

您的向量包含一个

 std::vector<std::vector<sphere_data>>

这只是一个向量结构本身的数组。 Sphere_image.size()给你多维向量顶层维度的值个数,仅此而已

首先,这仅在 sphere_data is a POD 时有效。如果是 class,这将不起作用。您必须分别遍历每个维度:

ofstream fout("C:/Project/data.dat", ios::out | ios::binary);

for (const auto &dim: Sphere_image)
   for (const auto &dim2:dim)
      fout.write(&dim2[0], dim2.size() * sizeof(sphere_data));

fout.close();

嵌套 std::vector 时,整个 数据结构在内存中没有连续性。

因此,您必须遍历所有嵌套向量 "dimensions",并假设 sphere_data 个实例仅在 最里面 向量。

那么,你的台词:

fout.write((char*)&Sphere_image[o], Sphere_image.size() *     
sizeof(sphere_data));

必须像这样展开:

for (const auto& vi : Sphere_image) { // For each outer vector
  for (const auto& vj : vi) {         // For each sub-vector
    // Now you do have contiguity for vj
    fout.write(
        reinterpret_cast<const char*>(vj.data()), 
        vj.size() * sizeof(sphere_data));
  }
}

请注意,这假设 sphere_data 是一个 POD,例如如果 sphere_data 中有指针数据成员,那将不起作用。

在这种情况下,您可以提供一个sphere_data::save(std::ofstream& out) const方法,您可以在最内层循环中调用该方法。 sphere_data 的实例将知道如何将它们自己序列化为二进制文件。例如:

for (const auto& vi : Sphere_image) { // For each outer vector
  for (const auto& vj : vi) {         // For each sub-vector
    for (const auto& sd : vj) {       // For each sphere data
      sd.save(fout);
    }  
  }
}

您也可以提供对称的 sphere_data::load() 方法。