1

私は次のようなC++のクラスを持っています:

class myCls
{
public:
   myCls();
   void setAngle(float angle);
   void setArr(unsigned char arr[64]);    
   unsigned char arr[64];
   double angle;
   int index;

   static float calcMean(const unsigned char arr[64]);
   static float sqrt7(float x);

};

これで、メインプログラムに、クラスの3Dベクトルがあります。

vector<vector<vector< myCls > > > obj;

ベクトルのサイズも動的に変更されます。私の質問は、ベクターのコンテンツをファイルに保存し、後で取得するにはどうすればよいですか?

私は多くの方法を試しましたが成功しませんでした。これが私の試みです。

std::ofstream outFile;
outFile.open(fileName, ios::out);
for(int i=0;i<obj.size();i++)
    {
        outFile.write((const char *)(obj.data()),sizeof(vector<vector<myCls> >)*obj.size());
    }
outFile.close();

そしてそれを読むために:

vector<vector<vector<myCls>>> myObj;
id(inFile.is_open())
{
    inFile.read((char*)(myObj.data()),sizeof(vector<vector<myCls> >)*obj.size());
}

私が得るのはrunTimeエラーだけです。

誰かがこの問題で私を助けてくれますか?

4

2 に答える 2

4

パフォーマンスをあまり気にしない場合は、boost::serializationを試してください。stlコンテナのシリアル化関数はすでに実装されているため、のシリアル化関数を作成するだけで、myCL他のすべては無料で提供されます。メンバー変数はすべてパブリックであるため、これを侵入的または非侵入的に行うことができます。

于 2012-09-29T15:04:44.720 に答える
0

内部的には、vectorほとんどの場合、現在の長さと割り当てられた長さ(容量)を表す2つの数値と、実際のデータへのポインターで構成されます。したがって、「生の」オブジェクトのサイズは固定されており、ポインタのサイズの約3倍になります。これはあなたのコードが現在書いているものです。ポインタが指す値は保存されません。読み返してみると、ほとんどの場合メモリが割り当てられていないものにポインタを設定しているため、ランタイムエラーが発生します。

一般に、コンストラクタ、デストラクタ、または代入演算子を提供するクラスのメモリを直接操作することは、非常に悪い考えです。のプライベートメンバーにコードを書き込むとvector、ポイントされたデータも復元するように注意したとしても、メモリ管理が完全に混乱します。このため、単純な(POD)データのみを作成した方法で書き込む必要があります。他のすべては、カスタムコードを使用するようにカスタマイズする必要があります。

ベクトルの場合、おそらく最初に長さを格納してから、要素を1つずつ書き込みます。読み取るには、長さを読み取り、それに応じてメモリを予約してから、要素を1つずつ読み取ります。Voltronによって提案されboost::serializationテンプレートは、おそらくそれらすべてを実装する手間を省くでしょう。

于 2012-09-29T18:07:27.980 に答える