正在将void指针写入二进制文件



我正在尝试将VLFeat中的VlGMM写入并读取到一个二进制文件,特别是它的组件void *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));
    }

如果我试图通过这段代码在两个函数中打印means值(注意,我知道这意味着用浮点填充):

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

打印的值在相同的程序执行中是相同的,所以我猜上面的代码是有效的。无论如何,我认为我在文件中写的是指针值,而不是mean's值本身!在不同的程序执行中,上面的代码可能不起作用吗?

这是因为当程序执行终止时,gmm被释放,means也被释放,并且保存的指针没有意义。

这是正确的吗?我该如何解决这个问题?

在不同的程序执行中,上面的代码可能不起作用吗?

是的,它和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);

最新更新