c ++如何以二进制模式在文件中存储void *

时间:2016-01-29 00:29:37

标签: filestream void

我有以下函数在void vertexBufferObject::addData(void* ptrData, unsigned int uiDataSize) { //data is a std::vector<unsigned char> data.insert(data.end(), (char*)ptrData, (char*)ptrData+uiDataSize); iCurrentSize += uiDataSize; } 调用数据中存储2种不同类型的数据:

void* vertexBufferObject::getDataPointer()
{
    return (void*)data[0];
}

现在..一旦向量填充,我得到一个void *到std :: vector原始数据:

//im trying this
void* result = getDataPointer();

file.write(reinterpret_cast<const char*>(&result), iCurrentSize );

我需要在二进制模式下用这个数据(getDataPointer())编写一个文件。我怎么能这样做?:

std::vector<unsigned char>

然后..我如何安全地恢复它(使用read())并再次存储在std::vector<unsigned char> retrievePointerData; //here im trying to get the previous saved void* in my std::vector<unsigned char> file.fread(reinterpret_cast<char*>(&retrievePointerData), iCurrentSize );

例如:

exports.render = function(req,res) {

res.render('index', {
    title: 'Hello World',
    user: JSON.stringify(req.user)
});

};

非常感谢!

1 个答案:

答案 0 :(得分:0)

好的,我想我现在明白了。所以,我认为getDataPointer()应该是:

void* vertexBufferObject::getDataPointer()
{
    return (void*)&data[0];
}

即。返回一个指向数据开头的指针,而不是一个指向数据第一个字节的值的指针。

然后我认为你的重新诠释应该是:

file.write(reinterpret_cast<const char*>(result), iCurrentSize );

即。将void指针强制转换为const char *指针。不是void指针的地址 - 它给你一个指向指针的指针。

至于阅读它,你需要在开始之前以某种方式知道大小 - 也许首先将它作为固定大小的int写入文件的开头?无论如何,你可能只需要将向量调整大小()到已知大小,然后读入数据:

// We assume here that iCurrentSize is actually valid.
std::vector<unsigned char> retrievePointerData;
retrievePointerData.resize(iCurrentSize);
file.fread(reinterpret_cast<char*>(&retrievePointerData[0]), iCurrentSize );

我必须承认,我通常在c ++中使用iostreams作为文件IO,所以我对你的file.write / file.fread调用不太熟悉。

另外,您可能想要考虑不要重新解释强制转换,并完全删除void *。如果你只是传递unsigned char *(或者更好的是,将它定义为类似于Win32的BYTE *那么)那么你的所有类型都将使用文件IO调用。