Linux C++内存映射方式读写文件
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include<stdio.h>
#include<stdlib.h>
#include<sys/mman.h>
#include<unistd.h>
#include<fcntl.h>
#define
NumReconds 100
typedef struct
{
int iNum;
char sName[24];
}
Recond;
int main(void)
{
Recond
recond,*mapped;
int i,f;
FILE *fp;
fp=fopen("recond.dat","w+");
for(
i=0; i < NumReconds; i++)
{
recond.iNum
= i;
sprintf(recond.sName,"Recond-%d
",i);
fwrite(&recond,sizeof(Recond),1,fp);
}
fclose(fp);
//使用传统方式修改文件内容
fp
= fopen("recond.dat","r+");
//获得要修改文件的位置
fseek(fp,43*sizeof(recond),SEEK_SET);
fread(&recond,sizeof(recond),1,fp);
recond.iNum
= 143;
sprintf(recond.sName,"Recond-%d",recond.iNum);
fwrite(&recond,sizeof(recond),1,fp);
fclose(fp);
//使用内存映射的方式打开文件,修改文件内存
//注意这里是open打开不是fopen!!!!
f
= open("recond.dat",O_RDWR);
//获得磁盘文件的内存映射
mapped
= (Recond *) mmap(0 , NumReconds * sizeof(Recond)
, PROT_READ|PROT_WRITE, MAP_SHARED, f, 0);
mapped[43].iNum
= 999;
sprintf(mapped[43].sName,"Recond-%d",mapped[43].iNum);
//将修改同步到磁盘中
msync((void *)mapped,NumReconds*sizeof(recond),MS_ASYNC);
//关闭内存映射
munmap((void *)mapped,NumReconds*sizeof(recond));
close(f);
exit(0);
}
|
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: 精讲哈夫曼压缩算法
- 下一篇:没有了
