将void指针写入二进制文件

时间:2016-07-24 10:08:13

标签: c++ pointers binaryfiles

我正在尝试从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,并且保存的指针没有意义。

这是对的吗?我该如何解决这个问题呢?

1 个答案:

答案 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);