#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. Masonry使用详解

    mas_makeConstraints 只负责新增约束 Autolayout不能同时存在两条针对于同一对象的约束 否则会报错 mas_updateConstraints 针对上面的情况 会更新在blo ...

  2. C++中L和_T()之区别

    字符串前面加L表示该字符串是Unicode字符串._T是一个宏,如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L,否则字符串不变.因此,Visual C++里边定 ...

  3. Java导出Excel表(poi)名中文乱码问题处理

    <pre name="code" class="java">String _filename = ValidateTools.date2Str(da ...

  4. C++矩阵处理库--Eigen初步使用

      项目要进行比较多的矩阵操作,特别是二维矩阵.刚开始做实验时,使用了动态二维数组,于是写了一堆Matrix函数,作矩阵的乘除加减求逆求行列式.实验做完了,开始做代码优化,发现Matrix.h文件里适 ...

  5. C --> OC with RunTime

    前言 本来打算写一篇关于runtime的学习总结,无奈长篇大论不是我的风格,就像写申论一样痛苦,加之网上关于tuntime的文章多如牛毛,应该也够童子们学习的了,今天就随便聊聊我的理解吧. runti ...

  6. HDU1874 最短路 SPFA

    最短路 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 24  Solved: 17 [Submit][Status][Web Board] Descr ...

  7. angular.js_$scope

    Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带. Scope 是一个对象,有可用的方法和属性. Scope 可应用在视图和控制器上. Angular ...

  8. Node.js学习 - File Operation

    同步异步 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync(). 异步的方法函数最后一个参数为 ...

  9. 转:设置Loadrunner负载机临时文件目录

    最近在跑稳定性测试 3 X 24小时的时候,发现负载机产生的日志还运行记录等等竟然有100多G! C盘空间不足,但是D盘还有700多G空间呢,怎么让临时文件转移到D盘? 此处分两种情况: 一. 修改本 ...

  10. Lint Code——最多共线的点的个数

    题目链接:http://www.lintcode.com/zh-cn/problem/max-points-on-a-line/# 条件:给一个点数组 目标:求出共线的点的最多个数 实现:时间复杂度- ...