文件内存映射 加快对文件的读写速度
利用内存映射原理 实现对数据的读写和保存至文件 省去了write () .read()的使用.
本例实现了类似于小型数据库 对学生信息的增添查改功能
代码如下:
#include<stdlib.h> #include<stdio.h> #include<string.h> #include<sys/mman.h> #include<sys/types.h> #include<fcntl.h> #include<unistd.h> #define MALLOC (Stu*)malloc(sizeof(Stu)) static int num = 0; typedef struct{ char stu_num[10]; char stu_name[16]; int stu_age; char stu_class[20]; }Stu; //添加学生信息 Stu *stu_add(Stu *p) { int i; printf("学号 姓名 年龄 班级 \n "); scanf("%s%s%d%s",(p+num)->stu_num,(p+num)->stu_name,&((p+num)->stu_age),(p+num)->stu_class); num++; return p; } //查找学生信息 void stu_search(Stu *p) { int i; char Num[10]; printf("请输入要查找学生的学号:"); scanf("%s",Num); for(i = 0;i < num;i++) { if(strcmp((p+i)->stu_num,Num) == 0) { printf("存在此学生信息\n"); printf("学号 姓名 年龄 班级\n"); printf("%s %s %d %s\n",(p+i)->stu_num,(p+i)->stu_name,(p+i)->stu_age,(p+i)->stu_class); break; } i++; } if(i >= num) { printf("没有学号为:%s学生的信息\n",Num); } } //删除学生信息 Stu *stu_del(Stu *p) { int i,j; char Num[10]; printf("请输入要删除学生的学号:"); scanf("%s",Num); for(i = 0;i < num;i++) { if(strcmp((p+i)->stu_num,Num)==0) { for(;i<num;i++) { j=i+1; strcpy((p+i)->stu_num,(p+j)->stu_num); strcpy((p+i)->stu_name,(p+j)->stu_name); (p+i)->stu_age = (p+j)->stu_age; strcpy((p+i)->stu_class,(p+j)->stu_class); } num--; printf("找到并删除该学生信息\n"); break; } } if(i>=num-1) { printf("没有该学生信息\n"); } return p; } //修改学生信息 Stu *stu_change(Stu *p) { char Num[10]; int i; printf("请输入学生学号:"); scanf("%s",Num); for(i = 0;i < num;i++) { if(strcmp((p+i)->stu_num,Num)==0) { printf("请输入要修改的信息:\n"); printf("学号 姓名 年龄 班级\n"); scanf("%s%s%d%s",(p+i)->stu_num,(p+i)->stu_name,&((p+i)->stu_age),(p+i)->stu_class); break; } } if(i < num){ printf("学号为%s学生的信息已修改\n",Num); }else{ printf("没有学号为%s学生的信息\n",Num); } } //显示学生信息 void stu_show(Stu *p) { int i; if(num == 0){ printf("没有记录学生信息\n"); }else{ printf("shoiw :学号 姓名 年龄 班级\n"); for(i = 0;i < num;i++) { printf("\t%s %s %d %s\n",(p+i)->stu_num,(p+i)->stu_name,(p+i)->stu_age,(p+i)->stu_class); } printf("以显示全部信息\n"); } } int main(int argc,char *argv[]) { if(argc != 2){ perror("argv[1]"); exit(1); } int fd; Stu *stu; Stu *q = MALLOC; fd = open(argv[1],O_CREAT|O_RDWR,00777); if(fd == -1){ perror("argv[1]"); exit(1); } write(fd,q,sizeof(Stu)); lseek(fd,100*sizeof(Stu),SEEK_CUR); write(fd,q,sizeof(Stu)); lseek(fd,0,SEEK_SET); stu = (Stu*)mmap(NULL,sizeof(Stu)*100,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if(stu == MAP_FAILED){ perror("mmap failed!\n"); } close(fd); fd = open("1.txt",O_RDWR|O_CREAT,00777); if(fd == -1){ perror("1.txt failed to open !\n"); } int i = read(fd,&num,sizeof(int)); if(i <= 0){ num = 0; } close(fd); char choose; while(1) { printf("\t\t******** 1. 添加 ********\n"); printf("\t\t******** 2. 删除 ********\n"); printf("\t\t******** 3. 修改 ********\n"); printf("\t\t******** 4. 查找 ********\n"); printf("\t\t******** 5. 显示 ********\n"); printf("\t\t******** 0. 退出 ********\n"); printf("请输入你的操作:"); choose = getchar(); switch(choose) { case '1': stu = stu_add(stu);break; case '2': stu = stu_del(stu);break; case '3': stu_change(stu);break; case '4': stu_search(stu);break; case '5': stu_show(stu);break; case '0': printf("QUIT!\n");break; default : printf("没有此选项!\n"); } getchar(); printf("\n"); if(choose == '0'){ break; }else{ continue; } } fd = open("1.txt",O_RDWR); if(fd == -1){ perror("1.txt open error!\n"); exit(1); } write(fd,&num,sizeof(int)); close(fd); munmap(stu,sizeof(Stu)*100); return 0; }
如有问题 请联系QQ2120397197