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);
}
|
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: C语言之网络编程(服务器和客户端)
- 下一篇: C语言链接数据库