我正在尝试从VLFeat写入和读取VlGMM
到二进制文件,特别是其组件void *means
。您可以找到类代码here。
这是我写的两个函数:
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)<<" ";
在同一程序执行中打印的值与相同,所以我猜上面的代码有效。无论如何,我认为我在文件中写的是指针值,而不是mean's
值本身!是否有可能在不同的程序执行中上面的代码不起作用?
这是因为当程序执行终止时gmm
被解除分配,因此means
,并且保存的指针没有意义。
这是对的吗?我该如何解决这个问题呢?
答案 0 :(得分: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);