2016-07-24 13 views
-6

私は、VLFeatからバイナリファイル、特にそのコンポーネントvoid *meansVlGMMを書き込み、読み込もうとしています。クラスコードhereが見つかります。バイナリファイルへのvoidポインタの書き込み

これは私が書いた2つの機能である:

:私はこのコード(私は手段が浮動小数点で満たされていることを知っているという通知)を介して、両方の機能で means値を印刷しようとした場合

void writeVlGMM(const std::string &name, VlGMM* gmm){ 
     std::ofstream out(name,std::ios_base::binary); 
     const void *means = vl_gmm_get_means(gmm); //dimension*numComponents elements 
     out.write((char *) &means, sizeof(means)); 
     for(int i=0;i<dimension*numComponents;i++) 
      std::cout<<*((float*)(means)+i)<<" "; 
     std::cout<<std::endl; 
    } 
void readVlGMM(vl_type dataType, const std::string &name, VlGMM* gmm, vl_size dimension, vl_size numComponents){ 
     std::ifstream in(name, std::ios::binary); 
     vl_size size = vl_get_type_size(dataType) ; 
     void *means = vl_calloc (numComponents * dimension, size) ; 
     in.read((char *) &means, sizeof(means)); 
    } 

for(int i=0;i<dimension*numComponents;i++) 
     std::cout<<*((float*)(means)+i)<<" "; 

プリント値は、同じプログラムの実行において同じであるので、私は、作品上記のコードと推測します。とにかく、私はファイルに書いているのはポインタの値で、mean'sという値ではないと思います!上記のコードが異なるプログラムの実行で動作しない可能性はありますか?

gmmが終了すると、meansとなり、保存されたポインタは意味を持たないからです。

これは間違いありませんか?どうすれば問題を解決できますか?

+1

1.(意味を持たない)ことはできませんがvoidポインタを書き、このポインタが指し示すセンスの書き込み内容を持っています。件名が間違っています –

+0

@JacekCz:ファイルに 'void *'を書くのが意味をなさない場合、あなたは正しいです(これがデバッグ/トレースファイルでない限り)。どうやらOPはファイルに 'float'を書き込もうとしますが、それでもまだ明確ではありません。 – Olaf

+0

ルックアップ_de-/serialization_ –

答えて

3

異なるプログラムの実行で、上記のコードが機能しない可能性はありますか?

はい、可能な限り1+1==2です。

これは間違いありませんか?

絶対に。

どうすれば問題を解決できますか?

書き込みむしろそのアドレスより、アレイ読み:

vl_size size = vl_get_type_size(dataType); 
const void *means = vl_gmm_get_means(gmm) 
out.write(static_cast<const char*>(means), numComponents * dimension * size); 

/// ... 

vl_size size = vl_get_type_size(dataType); 
void *means = vl_calloc (numComponents * dimension, size) ; 
in.read(static_cast<char*>(means), numComponents * dimension * size); 
+1

ファイルに浮動小数点値を書き込むことに加えて、コードは最初にファイルの項目数を書き込んでから、読み込み時に書き込まれた数値読み取られた番号です。 –

+0

@RossBencinaはい、明らかな改善となるでしょう。 –

+0

また、この回答の所定のコードは、読み書きプログラムが同じバイトオーダー/エンディアンを持つことを前提としています。 –

関連する問題