2016-10-05 4 views
1
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(); 
+0

Кажется, что ваша структура данных стала сферической. Вы можете использовать три вложенных цикла для получения содержимого вложенного вектора и записи в файл. – seccpur

+0

Почему нисходящий вопрос - он пытался что-то сделать и очень четко разместил проблему? – UKMonkey

ответ

2

Когда у вас есть вложенные 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() метод, а также.

+0

Большое спасибо за помощь. Также, читая этот двоичный файл, мне нужно сделать то же самое? только с ifstream? – user6038334

+0

Теперь вот проблема, читая то же самое. Не могли бы вы помочь – user6038334

+0

При чтении данных из файла вам необходимо построить и заполнить векторы, поэтому код отличается. Я не знаю вашу проблему в деталях, но, например, вам может потребоваться записать в ваши файлы количество элементов вектора для каждого измерения, а также прочитать эти числа и создать векторы правильных размеров, а затем заполнить их сферическими данными, считанными из файлов , –

2

многомерный вектор не хранится в последовательных ячейках памяти, как многомерный массив.

Ваш вектор содержит

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

Это просто массив самих векторных структур. Sphere_image.size() дает вам количество значений в размере верхнего уровня многомерного вектора, вот и все.

Прежде всего, это будет работать, только если sphere_datais a POD. Если это класс, это не сработает. Вы должны перебирать каждое измерение отдельно:

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(); 
+0

этот код дает мне ошибку в & dim2 [0]. Ошибка: аргумент типа «cons sphere_dat *» несовместим с параметром типа const char ». – user6038334

+1

@ user6038334: Первым аргументом должен быть' reinterpret_cast (& dim2 [0]) '. Это' reinterpret_cast '- огромный красный флаг, а именно, что вы предполагаете, что sphere_data - это POD. –

+0

да, я сделал это, и это работает. – user6038334

Смежные вопросы