我有以下函数在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)
});
};
非常感谢!
答案 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调用。