C ++:从内存映射文件中读取/获取数据

时间:2013-09-18 13:36:16

标签: c++ windows memory-mapped-files

我使用CreateFileMapping和MapViewOfFile使用C ++ VS2010在Window下映射文件。

从我知道的映射文件中获取/读取数据的唯一方法是使用MemCpy。 但是,我希望可能有更快/更直接的方式。

有吗?如果是的话,有人可以发一个样品吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以将内存块转换为数据结构,作为指针

struct someStruct* data = (struct someStruct*)memAddress;

然后 您可以将数据作为指针访问

somefuction (data->var1, data->var2);

sum = data->var1 + data->var2;

你必须要很好,并确保映射结构与内存块匹配,否则你会得到一些垃圾

类似这样的事情

struct msgStructureCommon {     unsigned int messageID;     unsigned int messageSize;     char bufferLimit [1024-(2 * sizeof(unsigned int))]; };

struct msgStructureID911
{
unsigned int messageID;
unsigned int messageSize;
//someData....
};

struct msgStructureID2013
{
    unsigned int messageID;
    unsigned int messageSize;
//someData....
};

//在主

char* buffer = receiveData(socket);
struct msgStructureCommon* msgRCV = (struct msgStructureCommon*)buffer;
std::cout<< msgRCV->messageID << std::endl;    
if(msgRCV->messageID == 911)
{
   struct msgStructureID911* msg911 = (struct msgStructureID911*)buffer;
   if(msg911->messageSize >= MSG_LIMIT_SIZE_911)
   {
      std::cout<< msg911->someData<< std::endl;
   }
   else
   {
      std::cout<< "ops, message is not correct!" << std::endl;
   }
}
else if (msgRCV->messageID == 2013)
{
//...
}