【问题标题】:How can I get data from memory mapped file?如何从内存映射文件中获取数据?
【发布时间】:2015-03-23 17:43:59
【问题描述】:

我有一个名为 By_a_waterfal.txt 的文本文件,内容如下:

By a waterfal I'm calling you.
We can share it all beneath a ceiling of blue.
We'll spend a heavenly day
Here where the whispering waters play.

我通过函数调用来创建这个文件的内存映射:

HANDLE hFileMapping = CreateFileMapping(handleOfFile, NULL, PAGE_READ, 0, 0, NULL);

其中handleOfFile 是By_a_waterfal.txt 文件的句柄。 然后我进行以下调用:

LPVOID lpFileMap = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);

如何通过 MapViewOfFile 调用创建的视图访问内存映射的 By_a_waterfal.txt 文件的内容?

【问题讨论】:

    标签: visual-c++ memory-mapped-files file-read


    【解决方案1】:

    如果你真的必须使用内存映射来代替 std::ifstream,那么:

    1) 检查 lpFileMap 是否为 NULL。

    2) 获取视图大小为 GetFileSize(handleOfFile) 或 VirtualQuery(lpFileMap)。

    3) 如果文件具有 ANSI 编码(不是 Unicode),则将 lpFileMap 转换为 char* 并继续(不要忘记没有 0 终止符)

    auto data = static_cast<const char*>(lpFileMap);
    std::string strData(data, size);
    std::cout << stdData;
    

    【讨论】:

      【解决方案2】:

      lpFileMap 是指向内容的指针。例如,如果您希望内容为 const char*,只需将其转换为:

      const char* content = static_cast<const char*>(lpFileMap);
      

      【讨论】:

      • 那么,我可以像通过字符串变量一样遍历内容吗?但如果映射文件的大小很大,例如 20GB。在这种情况下,鉴于内存映射文件访问数据的最佳方式是什么?
      • 是的,您可以像我认为的字符串一样遍历内容,这取决于您的数据是什么。如果映射文件不能在一块内存中分配,那么lpFileMap 将为空。在这种情况下,最好的方法是每次映射一个较小的块。请参阅MapViewOfFile 文档中的dwNumberOfBytesToMap
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      相关资源
      最近更新 更多