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

Posted

技术标签:

【中文标题】C++:从内存映射文件中读取/获取数据【英文标题】:C++: Reading / getting data from a memory mapped file 【发布时间】:2013-09-18 13:36:15 【问题描述】:

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

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

有吗?如果是的话,有人可以发布一个示例吗?

谢谢!

【问题讨论】:

Memcpy() 需要一个指向视图的指针。只需直接使用该指针即可。这就像一个 XY 问题。如果您在仲裁访问视图时遇到问题,您只能问这个问题。需要一个命名信号量来防止您的应用程序在其他进程正在更新它时访问该视图。有了烟斗,生活就轻松多了。 【参考方案1】:

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

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

那么 您可以将数据作为指针访问

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

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

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

类似的东西

struct msgStructureCommon 无符号整数消息ID; 无符号整数消息大小; 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)

//...

【讨论】:

谢谢。也许还可以发布一个示例或编辑您的示例,以便我可以定义字节位置和结构的大小? 是的,我的意思只是一个例子。 你也可以嵌套和混合多个结构

以上是关于C++:从内存映射文件中读取/获取数据的主要内容,如果未能解决你的问题,请参考以下文章

内存映射阅读器找不到全局内存映射对象

向/从映射文件 C++ 写入和读取

如何从 .NET 中的内存映射文件中快速读取字节?

从 python 传递到 C++ 的数组中未映射的内存访问

笔记:I/O流-内存映射文件

numpy 数组的内存映射文件