利用mmap和数组方式的存取操作对结构化数据文件进行修改
2015-06-26 12:41
671 查看
#include <unistd.h> #include <stdio.h> #include <sys/mman.h> #include <fcntl.h> #include <stdlib.h> typedef struct//定义了一个包含下面两个数据类型的结构体 { int integer; char string[24]; } RECORD;//别名为RECORD #define NRECORDS (100)//宏定义NRECORDS为(100) int main()//主函数 { RECORD record, * mapped;//分别实现了一个record结构体,和一个指向结构体的指针mapped int i,f; FILE * fp;//定义了流指针fp fp=fopen("records.dat","w+");//以修改的方式打开文件,并将文件长度截断为0,没有的话就创建 for (i=0;i<NRECORDS; i++)//进入一个条件循环,循环100次 { record.integer=i;//给结构体的证书部分赋值为i sprintf(record.string, "RECORD-%d",i);//把格式化的输出传送到指定的地方,-代表左对齐 fwrite(&record, sizeof(record), 1, fp);//把赋值完成的record写入fp中,写入一个指定长度 } fclose(fp);//关闭打开的流指针 fp=fopen("records.dat","r+");//以写的方式打开文件,并创建文件流fd fseek(fp,43*sizeof(record),SEEK_SET);//设置文件流的下一次读写的位置,最后一个参数表示绝对位置 fread(&record,sizeof(record), 1, fp);//从fd中读取一个指定长度,到record结构体中 record.integer=143; //设置结构体中第一个元素的值为143 sprintf(record.string,"RECORD-%d",record.integer);//同样的把这个值按照左对齐方式传递给结构体的第二个元素 fseek(fp,43*sizeof(record),SEEK_SET);//重新设置文件流的下一次读写的位置 fwrite(&record,sizeof(record),1,fp);//给文件流写入一个指定长度的record内容 fclose(fp);//关闭打开的文件流 f=open("record.dat",O_RDWR);//使用系统调用open,以读写的方式打开文件,返回文件描述符f mapped=(RECORD *)mmap(0,NRECORDS*sizeof(record),PROT_READ|PROT_WRITE,MAP_SHARED,f,0); //创建指向0的内存,长度是100个指定长度,权限是读写内存段,flag取MAP_SHARED表示对内存段的修改保存到 //磁盘文件中,f就是和内存相关的描述符,偏移是0。总体来说是把文件转化为内存中的结构数组 mapped[43].integer=243;//设置结构数组中的第43个元素的第一个值 sprintf(mapped[43].string,"RECORD-%d",mapped[43].integer);//同样按照左对齐方式传递给结构数组第二个元素 msync((void *)mapped, NRECORDS*sizeof(record),MS_ASYNC);//把内存中的整段的修改按照异步写的方式写回到被映射的文件中 munmap((void *)mapped, NRECORDS*sizeof(record));//全部释放这个内存段 close(f);//关闭打开的文件描述符 exit(0); }
如果是前面不使用mmap程序可以顺利执行,但是加上后面的代码时候,terminal会提示说:
段错误 (核心已转储)
参考文献:
Linux程序设计 Neil Matthew
相关文章推荐
- nginx和apache的伪静态区别
- iOS开发笔记22--使用XIB自定义一个UIView
- [Solved]Find a Child in a QTreeView
- python decorator simple example
- JVM优化相关博客帖汇总
- TCHAR 转char
- java.lang.IllegalStateException: ActionBarImpl can only be used with a compatible window decor layou
- php 调用 mongodb
- Net-snmp 使用c 扩展 sub-agent
- CSS3 3D旋转动画代码实例
- 简单java web应用程序搭建与部署
- 网络数据包发送工具PacketSender中文源码
- TCP/IP协议族-----21、文件传送:FTP和TFTP
- Xen虚拟机磁盘镜像模板制作(三)—CentOS 7
- Android app开发中用户协议(使用条款)文字自动换行
- cocos2d-x3.6 连连看点击事件
- 数据库优化相关博客帖汇总
- 无意中看到,有一些感受。。。
- 一个Linux中用于监控的简易shell脚本
- 那些红极一时的BBS大佬们,还好吗