2012-03-30 30 views
1

問題:ファイルからオブジェクトを読み書きする必要があります。これはstd :: listをファイルに書き込んだり読み込んだりする必要がありますが、どのような場合でもT = int (これは単純になりますが)何らかのパラメータを使用します。 OutputFileStreamとInputFileStreamを持つJavaではこれが可能でしたが、これはJVMの機能だと思います。それはまたの指し示すデータを考慮していない、 -sizeofオペレータは、単にすべてのフィールドのサイズを返します。 は、しかし、私は、ファイルに/書き込みオブジェクトを読み取るしようとしています:生のオブジェクトをファイルに書き込む/読み込む

template <class T> 
bool write_object(std::fstream& out, const T& object) 
{ 
    bool result=false; 
    char* ptr; 
    const unsigned long size=sizeof(object); 
    if(out.good()) 
    { 
     result=true; 
     ptr=(char*)&object; 
     for(unsigned int i=0;i<size;i++) 
     { 
      out << *ptr; 
      ptr++; 
     } 
    } 
    return result; 
} 

template <class T> 
bool read_object(std::fstream& in, T& object) 
{ 
    bool result=false; 
    T* ptr; 
    T swap_temp; 
    const unsigned long size=sizeof(object); 
    char temp[size]; 
    std::streampos pos; 
    if(in.good()) 
    { 
     pos=in.tellg(); 
     if(pos!=-1) 
     { 
      result=true; 
      for(unsigned long i=0; i<size; i++) 
      { 
       if(!in.good()) 
       { 
        result=false; 
        break; 
       } 
       else 
       { 
        in >> temp[i]; 
       } 
      } 
     } 
    } 
    if(result==false) 
    { 
     in.seekg(pos); 
    } 
    else 
    { 
     ptr=(T*)temp; 
     swap_temp=*ptr; 
     object=swap_temp; 
    } 
    return result; 
} 

しかし、私は次のような問題に遭遇しました内部フィールド。 - クラス内にポインタがある場合、このポインタは "間違った"メモリアドレスを指している可能性があります(たとえば、メモリ内のCスタイルの文字列を指すポインタを使用すると、プログラムが終了するとプログラムのインスタンスが再び実行されると、この領域のメモリはどこにでも置くことができます。

私のコンパイラでsizeof(string)が4を返すので、この方法は間違っています。 したがって、割り当てられたCスタイルの文字列を指すためにcharポインタ(32ビットマシン上)を使用すると仮定します。おそらくそれは長さの痕跡を残さないだろう。 文字列に32文字がある場合は気付かずに、ポインタの値をコピーするだけです。

+3

事実から、シリアル化ライブラリが必要です(例えば、[Boost Serialization](http://www.boost.org/doc/libs/1_49_0/libs/serialization/doc/index.html))。 。これは実際にはうまく解決するにはかなり難しい問題です... –

答えて

3

C++はリフレクションのようなJavaのようなテクニックを知らないので、ポインタと他のメンバーを区別できないので、あなたのアプローチはうまくいかない。何をしたい

serialisazionと呼ばれ、あなたはBoost.SerializationDemo)のようなライブラリとそれを使用することができます。

でも、それでも一般的な関数を書くことはできません。オブジェクトごとに具体的に定義する必要があります。

関連する問題