将向量向量结构的向量写入二进制文件
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()
方法。
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()
方法。