【问题标题】:Memory mapped file C++内存映射文件 C++
【发布时间】:2016-12-08 22:43:20
【问题描述】:

请帮助我阅读内存映射文件。我在下面的代码中打开文件。然后我想从 8 到 16 读取字节。我该怎么做?

// 0. Handle or create and handle file
m_hFile = CreateFile(file_path.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (m_hFile == INVALID_HANDLE_VALUE)
{
    if (GetLastError() == ERROR_FILE_NOT_FOUND)
    {
        m_hFile = createNewFile(file_path.c_str());
    }
    else throw GetLastError();
}

// 1. Create a file mapping object for the file
m_hMapFile = CreateFileMapping(m_hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
if (m_hMapFile == NULL) throw GetLastError();

// 2. Map the view.
m_lpMapAddress = MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// to map
if (m_lpMapAddress == NULL) throw GetLastError();

【问题讨论】:

  • 是来自这个的副本:link。您有指针 m_lpMapAddress,希望它是一个字节指针。将 8 个字节添加到指针并读取内存。就是这样
  • @mrAtari 如何添加 8 个字节?
  • m_lpMapAddress +=8
  • @mrAtari:那行不通。 MapViewOfFile 返回void*。如果对m_lpMapAddress 的赋值没有强制转换,那么它的类型也必须是void*。您不能在 void* 上使用 operator+=。您必须先转换为特定类型(unsigned char 表示字节)。
  • 你听说过指针转换吗? char* 光标 = (char*)m_lpMapAddress;光标+=8;

标签: c++ file winapi


【解决方案1】:

您可以像访问任何其他内存块一样访问它。这是一个打印解释为unsigned chars 的字节的示例:

unsigned char *mappedDataAsUChars = (unsigned char*)m_lpMapAddress;

for(int k = 8; k < 16; k++)
    std::cout << "Byte at " << k << " is " << mappedDataAsUChars[k] << std::endl;

【讨论】:

  • 还有更漂亮的解决方案吗?如果我想读取结构中的字节怎么办?
  • @ExiD:访问内存的“更漂亮”方式?据我所知没有。更复杂?大概。但是,您到底不喜欢规范的做法是什么?
  • @ExiD 你可以很容易地做到MyStruct *mappedDataAsMyStruct = (MyStruct*)m_lpMapAddress; 或类似的。注意可能会使您的结构未按您想要的方式布置的对齐方式。
  • 对不起我的英语。我认为它可能使用 memcpy,但我不确定。
  • @ExiD 你也可以使用memcpy。
猜你喜欢
  • 2020-11-06
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
相关资源
最近更新 更多