当前位置:首页 > c++ > c++使用文件映射的方式读取超大文件

c++使用文件映射的方式读取超大文件

xuwenyan7个月前 (02-17)c++620

内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

文件映射的优点

  • 1.减少I/O操作

  • 2.支持大文件

简单的文件映射读取文件例子

#include <windows.h>
#include <iostream>

int main() {
  HANDLE hFile = ::CreateFile(L"1.txt",
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL);
  if (hFile == INVALID_HANDLE_VALUE)
    return 1;

  do {
    LARGE_INTEGER large_integer = { 0 };
    if (!::GetFileSizeEx(hFile, &large_integer))
      break;

    size_t file_size = (size_t)large_integer.QuadPart;
    HANDLE map_file = ::CreateFileMapping(hFile,
      nullptr,
      PAGE_READONLY,
      0,
      0,
      nullptr);
    if (map_file == nullptr)
      break;

    do {
      LPVOID pMap = ::MapViewOfFile(map_file, FILE_MAP_READ, 0, 0, 0);
      if (pMap == nullptr)
        break;

      char* buf = (char*)::malloc(file_size);
      if (buf) {
        memcpy(buf, pMap, file_size);
        std::cout << buf << std::endl;
        ::free(buf);
      }

      ::UnmapViewOfFile(pMap);
    } while (0);
  
    ::CloseHandle(map_file);
  } while (0);

  ::CloseHandle(hFile);

  system("pause");

  return 0;
}
    文章作者:xuwenyan
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    相关文章

    vs(vs2015)拖动或停靠窗口崩溃的解决方法

    vs(vs2015)拖动或停靠窗口崩溃的解决方法

    使用vs拖动窗口后想要停靠某一个区域时,ide会崩溃重启,而且会反复这样,拖动布局功能基本丧失,使用起来非常不爽。解决办法如下: vs2019(visual studio 2019) 如...

    ATL实现windows右键菜单扩展(ContextMenu)

    ATL实现windows右键菜单扩展(ContextMenu)

    右键菜单,即用户右击shell对象时弹出的上下文菜单(context menu)。本文记录了如何创建右键菜单的基本过程,跟着步骤一步一步来,即可创建出一个右键菜单工程。第一步,新建一个ATL工程Vis...

    c++函数模板参数类型限定

    c++函数模板参数类型限定

    函数模板函数模板可以实现对不同数据类型做统一操作,比如比较两个数据的大小:template<typename T> bool compare(T& ...

    static_assert和assert有什么区别?

    static_assert和assert有什么区别?

    static_assert和assert都是断言,都可用于判断一个条件是否成立,并且在条件不成立时及时给出错误提示。那它们用什么不同和需要注意的地方呢? 1:static_assert在编译...

    c++为什么不能在构造函数里调用虚函数?

    c++为什么不能在构造函数里调用虚函数?

    c++为什么不能在构造函数里调用虚函数? c++的构造顺序先构造父类,然后构造子类,析构顺序相反。 如果在构造函数调用虚函数,例如:ClassB继承于ClassA,如果在ClassA的构...

    堆和栈有什么区别?哪个比较快?

    堆和栈有什么区别?哪个比较快?

    我们都知道,windows内存区域无外乎堆、栈、静态区、常量区,下面主要说一说堆和栈。 首先我们要注意一个容易混淆的点,我们经常会听人把堆栈连起来说,通常堆栈指的是栈,而不是堆。 什么是...

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法和观点。