2016-07-24 36 views
-6

我試圖從VLFeat寫入和讀取VlGMM二進制文件,特別是其組件void *means。您可以找到課程代碼here寫入void指針到二進制文件

這是我已經寫了2個功能:

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

如果我試圖通過這個代碼(請注意,我知道這意味着充滿浮動點)打印在這兩個函數means值:

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

印刷值是在相同的程序執行相同,所以我想上述作品的代碼。無論如何,我認爲我在文件中寫的是指針值,而不是自己的值!上面的代碼在不同的程序執行中有可能不起作用嗎?

這是因爲程序執行終止時gmm被解除分配等means,並且保存的指針沒有意義。

這是正確的嗎?我該如何解決這個問題?

+1

1.不能(沒有道理)寫空指針,具有由該指針指向意義上寫的內容。主題錯誤 –

+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

此外,此答案中的給定代碼假定讀寫程序具有相同的字節順序/字節順序。 –