#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;
}

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

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

    .Net Core 跨平台:一个简单程序的多平台(windows.Linux.osx)发布 .Net Core 3.0 已于2019年9月23日发布了,包含了一些新特性,具体参见Announcing ...

  2. 【Python】从文件中读取数据

    从文件中读取数据 1.1 读取整个文件 要读取文件,需要一个包含几行文本的文件(文件PI_DESC.txt与file_reader.py在同一目录下) PI_DESC.txt 3.1415926535 ...

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

    如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中 进行权限的配置: Java代码:   <!-- 在sd中创建和删除文件的权限 --> ...

  4. TF从文件中读取数据

    从文件中读取数据 在TensorFlow中进行模型训练时,在官网给出的三种读取方式,中最好的文件读取方式就是将利用队列进行文件读取,而且步骤有两步: 把样本数据写入TFRecords二进制文件 从队列 ...

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

    直接上码 import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java ...

  6. 归纳从文件中读取数据的六种方法-JAVA IO基础总结第2篇

    在上一篇文章中,我为大家介绍了<5种创建文件并写入文件数据的方法>,本节我们为大家来介绍6种从文件中读取数据的方法. 另外为了方便大家理解,我为这一篇文章录制了对应的视频:总结java从文 ...

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

    c语言实现二进制(01)转化成txt格式文本: 下面的程序只能实现ascall对应字符转换,如果文件内出现中文字符,则会出现错误. 本程序要自己创建个文本格式的输入文件a1.txt,编译后能将文本文件 ...

  8. spring 框架的xml文件如何读取properties文件数据

    spring 框架的xml文件如何读取properties文件数据 第一步:在spring配置文件中 注意:value可以多配置几个properties文件 <bean id="pro ...

  9. 【asp.net】asp.net实现上传Excel文件并读取数据

    #前台代码:使用服务端控件实现上传 <form id="form1" runat="server"> <div> <asp:Fil ...

随机推荐

  1. json 帮助工具

    import java.lang.reflect.Type; import com.google.gson.Gson; /** * json 帮助工具 */public final class Gso ...

  2. nodejs 命令篇

    1.npm init // 生成package.json 2.npm install --save-dev gulp-jslint // 安装gulp-jslint模块,并把模块名和版本保存到pack ...

  3. 【翻译】Longest Palindromic Substring 最长回文子串

    原文地址: http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html 转载请注明出处:http:// ...

  4. C#中的Virtual、Override和new关键词理解

    来源:http://blog.csdn.net/jackiezhw/article/details/2673992 在 C# 中,派生类可以包含与基类方法同名的方法. 基类方法必须定义为 virtua ...

  5. iabtis初探

    1.简介 与Hibernate相比,ibatis属于一种半自动的ORM框架,主要解决了java对象与SQL入参及结果集的映射关系.简单易学.容易上手:但是安全性较差,对于金融等对安全要求较高的系统来说 ...

  6. 连接SQLServer OLEDB数据库(ACCESS) ODBC Oracle

    web.Config文件中的连接字符串 <configuration> <system.web> <compilation debug="true" ...

  7. 学习笔记:GLSL Core Tutorial – Pipeline (OpenGL 3.2 – OpenGL 4.2)

    GLSL Core Tutorial – Pipeline (OpenGL 3.2 – OpenGL 4.2) GLSL 是一种管道,一种图形化的流水线 1.GLSL 的具体工作流程: 简化流程如下: ...

  8. Android OpenGL ES(十四)gl10方法解析

    Android 支持 OpenGL 列表 1.GL 2.GL 10 3.GL 10 EXT 4.GL 11 5.GL 11 EXT 6.GL 11 ExtensionPack 我们将使用 GL10 这 ...

  9. div.2/C. They Are Everywhere<two pointer>

    题意: 给出包含n (3<=n<=100000)个字符的字符串,计算出包含所有类型字符的最小区间长度. 题解: Two pointer.注意区间的处理. #include<cstdi ...

  10. ReactiveCocoa 浅析

    转载自:http://limboy.me/ios/2013/12/27/reactivecocoa-2.html   ReactiveCocoa是Github开源的一款cocoa FRP 框架,我在之 ...