内存映射文件代码在C ++中无法正常工作

时间:2014-01-10 20:38:31

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

我试图通过将大文件映射到内存来读取大文件以提高效率。打开文件,创建内存映射对象和视图后,我试图通过取消引用指向内存的指针来访问文件中的值,但我没有得到文件中的实际值。

对于一个小型实验,我试图读取以下文件中的值" test.txt"其中包括4个整数     1 2     3 4

这是我的代码。

HANDLE hCreateFile;
HANDLE hMapFile;
LPVOID lpMapAddress;
char tempFile[200];
strcpy(tempFile,"C:\\...\\test.txt");
hCreateFile = CreateFile(tempFile,GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);   //Opens the "tempFile" and returns an handle to the file

if(hCreateFile == INVALID_HANDLE_VALUE) {
    std::cout<<"Problem opening the file"<<std::endl;
}

hMapFile = CreateFileMapping(hCreateFile, NULL, PAGE_READONLY, 0, 0, 0);
if(hMapFile == 0)   {
    std::cout<<"Problem creating map file object"<<std::endl;
}

lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
if(lpMapAddress == 0){
    std::cout<<"Problem viewing the file"<<std::endl;
}

int* mp = (int*)lpMapAddress;
std::cout<<"The first dose value is "<<*mp<<" ";
std::cout<<"The second dose value is "<<*(mp+1)<<" ";
std::cout<<"The third dose value is "<<*(mp+2)<<" ";
std::cout<<"The fourth dose value is "<<*(mp+3)<<;

从这段代码中,我期望获得的输出是     1 2 3 4

然而,我得到的是这样的东西     221388849 874525450 0 0

在上面的代码中,有人可以帮助我解决我的错误吗?谢谢。

2 个答案:

答案 0 :(得分:1)

看起来你正在读取ASCII数据,并希望神奇地转换为整数。

想想文本是什么:

“1 2 3 4”

现在你的第一个值:221388849

是0x0D322031

0x31 =“1” 0x20 =“” ox32 =“2”

......等等。

答案 1 :(得分:0)

使用文件映射API读取简单的文本文件听起来不太好。掌握如何阅读简单的文本文件 - 使用更简单的函数,如fopen / fscanfifstream类。然后了解使用CreateFileReadFile阅读相同的文件。使用文件映射是一个很大的禁忌,除非你理解什么是文本文件和什么是二进制文件(实际上什么都不是 - 它只是你打开文件的方式)。

要以文本模式打开文件,请使用带有 t 选项的fopen(此功能的默认设置)。要以二进制模式打开,您需要明确指定 b 模式。

存储在文件中的数字1并不意味着值1.它实际上是49.因为1的ASCII是整数49.您正在尝试读取此值(一个字节)整数。整数是4个字节(一般化,并根据您的情况假设)。剩下的3个字节将是垃圾(其中三个 - 前三个或后三个 - 你想出来了!!)。只有1个字节(int-4字节的第一个或最后一个),1的值为49.你永远不会得到一个,两个或四个字节整数的1(你得到了仅49)。

因为&#34; 1 2 3 4&#34;存储在文件中,&#39; 1`(49),空格(ASCII 32)...被存储。您可能会得到以下序列:

49,32,50,32,51,32 ......

将前四个字节解析为此整数(在程序员模式下使用Windows 7计算器)。

要了解很多......