2016-10-05 19 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

データ構造が球形になっているようです。 3つのネストされたループを使用して、ネストされたベクトルの内容を取得し、ファイルに書き込むことができます。 – seccpur

+0

なぜ質問のためのdownvote - 彼は何かをしようとしていると、問題を非常に明確に投稿しましたか? – UKMonkey

答えて

2

あなたがstd::vector Sを入れ子にしたら、あなたは全体データ構造のためにメモリ内の連続性を持っていません。

だから、あなたは、すべてのネストされたベクトル「寸法」を反復処理し、唯一最も内側ベクトルでsphere_dataインスタンスの連続性を前提としなければなりません。

だから、あなたの行:これはとても例えば、sphere_dataPODであることを前提としていることを

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

注:

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

はそのような何かを拡大しなければなりません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

ファイルからデータを読み込むときは、コードが異なるので、ベクトルを構築して読み込む必要があります。私はあなたの問題を詳細にはわかりませんが、たとえば、各次元のベクトル項目の数をファイルに書き込んで、それらの数値を読み込んで適切なサイズのベクトルを作成し、ファイルから読み込んだsphere_data 。 –

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

関連する問題