Когда у вас есть вложенные std::vector
с, вы не примыканием в памяти для структуры данных всего.
Таким образом, вы должны перебрать все вложенные векторы «размеры», и предположим, примыкание 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()
метод, а также.
Кажется, что ваша структура данных стала сферической. Вы можете использовать три вложенных цикла для получения содержимого вложенного вектора и записи в файл. – seccpur
Почему нисходящий вопрос - он пытался что-то сделать и очень четко разместил проблему? – UKMonkey