一个简单但详细的解释Windows文件映射读取数据文件的例子

#include <windows.h>
#include <string.h>
#include <string>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
// 步骤1 打开文件FILE_FLAG_WRITE_THROUGH
HANDLE hFile = CreateFile(
"demo.txt",
GENERIC_WRITE | GENERIC_READ,// 如果要映射文件:此处必设置为只读(GENERIC_READ)或读写
0, // 此设为打开文件的任何尝试均将失败
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, //|FILE_FLAG_WRITE_THROUGH,【解1】
NULL);
if (hFile != INVALID_HANDLE_VALUE)// 文件打开失败返回句柄为-1
// 这步必须测试,详细见步骤2
{
cout<<"文件打开成功~!\n";
}
else
{
cout<<"文件打开失败!\n";
DWORD d = GetLastError();
cout<<d<<endl;
return -1;
}

// 步骤2 建立内存映射文件
DWORD dwFileSize = GetFileSize(hFile, NULL);
printf("文件大小为:%d\n", dwFileSize);
HANDLE hFileMap = CreateFileMapping(
hFile, // 如果这值为INVALID_HANDLE_VALUE,是合法的,上步一定测试啊
NULL, // 默认安全性
PAGE_READWRITE, // 可读写
0, // 2个32位数示1个64位数,最大文件字节数,
// 高字节,文件大小小于4G时,高字节永远为0
0,//dwFileSize, // 此为低字节,也就是最主要的参数,如果为0,取文件真实大小
NULL);
if (hFileMap != NULL)
{
cout<<"内存映射文件创建成功~!\n";
}
else
{
cout<<"内存映射文件创建失败~!"<<endl;
}

// 步骤3:将文件数据映射到进程的地址空间
PVOID pvFile = MapViewOfFile( //pvFile就是得到的指针,用它来直接操作文件
hFileMap,
FILE_MAP_WRITE, // 可写
0, // 文件指针头位置 高字节
0, // 文件指针头位置 低字节 必为分配粒度的整倍数,windows的粒度为64K
0); // 要映射的文件尾,如果为0,则从指针头到真实文件尾
if (pvFile != NULL)
{
cout<<"文件数据映射到进程的地址成功~!\n";
}
else
{
cout<<"文件数据映射到进程的地址成功~!\n";
}

// 步骤4: 像操作内存一样操作文件,演示功能把整个文件倒序
char *p = (char*)pvFile;
printf("%s\n", p);
for (unsigned int i = 0; i <= dwFileSize / 2; i++)
{
int nTmp = p[i];
p[i] = p[dwFileSize - 1 - i];
p[dwFileSize - 1 - i] = nTmp;
}
printf("%s\n", p);

cout<<"交换完毕,点击Enter退出"<<endl;

// 步骤5: 相关的释放工作
UnmapViewOfFile(pvFile); // 释放内存映射文件的头指针
CloseHandle(hFileMap); // 内存映射文件句柄
CloseHandle(hFile); // 关闭文件
getchar();
return 0;
}

时间: 2024-10-12 00:08:12

一个简单但详细的解释Windows文件映射读取数据文件的例子的相关文章

.Net Core 跨平台:一个简单程序的多平台(windows、Linux、osx)发布

.Net Core 跨平台:一个简单程序的多平台(windows.Linux.osx)发布 .Net Core 3.0 已于2019年9月23日发布了,包含了一些新特性,具体参见Announcing .NET Core 3.0 .NET Core是一个跨平台,高性能,开放源代码框架,用于构建现代的,基于云的,Internet连接的应用程序框架,其具有一下优点和特点: 跨平台:.NET Framework应用程序仅在Windows平台上运行,而.NET Core应用程序可以在Windows平台上开

【Python】从文件中读取数据

从文件中读取数据 1.1 读取整个文件 要读取文件,需要一个包含几行文本的文件(文件PI_DESC.txt与file_reader.py在同一目录下) PI_DESC.txt 3.1415926535 8979323846 2643383279 5028841971 file_reader.py with open("PI_DESC.txt") as file_object: contents = file_object.read() print(contents) 我们可以看出,读取

《程序实现》从xml、txt文件里读取数据写入excel表格

直接上码 import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; impo

使用Pull解析器生成XML文件和读取xml文件

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器. 一.布局界面 [html] view plaincopyprint? <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

转-Android 之 使用File类在SD卡中读取数据文件

如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中 进行权限的配置: Java代码:   <!-- 在sd中创建和删除文件的权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 向SD卡中的写入权限 --> Java代码:   <uses-permission an

c文件二进制读取写入文件、c语言实现二进制(01)转化成txt格式文本、c读取文件名可变

c语言实现二进制(01)转化成txt格式文本: 下面的程序只能实现ascall对应字符转换,如果文件内出现中文字符,则会出现错误. 本程序要自己创建个文本格式的输入文件a1.txt,编译后能将文本文件前255字节以内的字符转换成相应的AscII码值的二进制表示,并存入输出文件a2.txt中.然后再将二进制文件还原并存入b2.txt文件. 参考链接:https://www.jb51.net/article/158695.htm 1 #include <cstdio> 2 #include <

从plist文件中读取数据

//从plist文件中读取数据- (void)readDataFromPlist{    //1.先获取文件路径    NSString * filePath = [[NSBundle mainBundle] pathForResource:@"Book" ofType:@"plist"];    //2.根据路径初始化字典对象    self.dic = [NSMutableDictionary dictionaryWithContentsOfFile:fileP

Mean and Standard Deviation-从文件中读取数据计算其平均数和标准差

Meanand Standard Deviation-从文件中读取数据计算其平均数和标准差 //Meanand Standard Deviation-从文件中读取数据计算其平均数和标准差 #include<iostream> #include<fstream> #include<cstdlib> #include<cmath>   int main() {     usingnamespace std;     ifstream fin;     ofstr

向现有的数据库中添加文件组和数据文件

一.在视图下添加文件和数据文件 1.点击数据库--右键属性--点击文件组--点击添加--添加完毕--点击文件--点击到你指定的文件组里面 二.使用sql语句添加文件组合数文件 --使用sql语句添加文件组和数文件--向E_Market数据库进行操作USE E_Market--添加组FG5ALTER DATABASE E_Market ADD FILEGROUP FG5 GO--为新建的文件组添加数据文件ALTER DATABASE E_Market ADD FILE(name='FG5_E_Ma