文件内存映射

                                                                         文件内存映射 加快对文件的读写速度

利用内存映射原理 实现对数据的读写和保存至文件  省去了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

猜你喜欢

转载自blog.csdn.net/fly_sky_share/article/details/78790481
今日推荐