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

c++ how to store a void* in a file in binary mode

我有以下功能,可将 2 种不同类型的数据存储在 std::vector<unsigned char> 称为数据中:

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;
}

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

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

我需要以二进制模式用此数据 (getDataPointer()) 写入一个文件。我该怎么做?:

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

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

然后..我怎样才能安全地恢复它(使用 read())并再次存储在 std::vector<unsigned char>?

例如:

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

非常感谢!

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

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

即return 指向数据开始的指针,而不是数据第一个字节的值的指针。

那我觉得你的重新诠释应该是:

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

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

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

// 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,所以我对你的文件不太熟悉。write/file.fread 调用。

此外,您可能需要考虑完全不考虑重新解释转换,并完全放弃 void*。如果您只是传递 unsigned char*(或者更好的是,像 Win32 那样将其类型定义为 BYTE*),那么您的所有类型都将只处理文件 IO 调用。