2016-07-24 27 views
-6

Ich versuche zu schreiben und zu lesen VlGMM von VLFeat in eine Binärdatei, insbesondere seine Komponente void *means. Sie finden den Klassencode here.Notieren Zeiger auf Binärdatei

Dies ist die 2-Funktionen, die ich geschrieben habe:

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

Wenn ich versuche, means Werte in beiden Funktionen durch diesen Code (Beachten Sie, dass ich weiß, dass bedeutet, mit schwimmenden Punkten gefüllt) zu drucken:

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

die gedruckte Werte sind die gleichen in der gleichen Programmausführung, also denke ich, dass der obige Code funktioniert. Jedenfalls denke ich, dass das, was ich in die Datei schreibe, der Zeigerwert ist, nicht der mean's Wert selbst! Ist es möglich, dass der Code in verschiedenen Programmausführungen nicht funktioniert?

Dies ist, weil wenn die Programmausführung beendet gmm freigegeben ist und so means, und der gespeicherte Zeiger ist bedeutungslos.

Ist das korrekt? Wie kann ich das Problem lösen?

+1

1. kann nicht (nicht sinnvoll) schreiben void-Zeiger, hat Sinn Schreib Inhalt dieses Zeiger zeigt. Betreff ist falsch –

+0

@JacekCz: Wenn Sie 'void *' in eine Datei schreiben macht keinen Sinn, Sie sind richtig (es sei denn, dies ist eine Debugging/Tracing-Datei). Anscheinend versucht OP, einen 'float' in die Datei zu schreiben, aber das ist immer noch nicht klar. – Olaf

+0

Lookup _de-/serialization_ –

Antwort

3

Ist es möglich, dass in verschiedenen Programmausführungen der obige Code nicht funktioniert?

Ja, es ist ungefähr so ​​möglich wie 1+1==2.

Ist das korrekt?

Absolut.

Wie kann ich das Problem lösen?

schreiben und lesen Sie das Array, anstatt seine Adresse:

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

Zusätzlich zum Schreiben der Gleitkommawerte in die Datei sollte der Code zuerst die Anzahl der Einträge in die Datei schreiben und dann beim Lesen überprüfen, dass die Zahl geschrieben wurde ist die Nummer, die gelesen wird. –

+0

@RossBencina ja, das wäre eine offensichtliche Verbesserung. –

+0

Der angegebene Code in dieser Antwort nimmt außerdem an, dass die Lese- und Schreibprogramme die gleiche Byte-Reihenfolge/Endianz haben. –