阅读背景:

文件映射实现对文件信息的增删改查

来源:互联网 
//以一个学生信息管理系统为例
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/mman.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#define MALLOC (Mes *)malloc(sizeof(Mes))static int num = 0;typedef struct {	char mes_num[10];	char mes_name[16];	int mes_age;	char mes_class[20];}Mes;//添加学生信息Mes *mes_add(Mes *p){	printf("学号 姓名 年龄 班级 \n");	scanf("%s%s%d%s",(p+num)->mes_num,(p+num)->mes_name,&((p+num)->mes_age),(p+num)->mes_class);	num++;	return p;}//查找学生信息void mes_search(Mes *p){	int i;	char NUM[10];	printf("请输入要查找的学生的学号:");	scanf("%s",NUM);	for(i=0;i<num;i++)	{		if(strcmp((p+i)->mes_num,NUM)==0)		{			printf("该学生信息存在!\n");			printf("学号 姓名 年龄 班级 \n");			printf("%s %s %d %s",(p+i)->mes_num,(p+i)->mes_name,(p+i)->mes_age,(p+i)->mes_class);			break;		}		i++;	}	if(i>=num)	{		printf("没有学号为:%s的学生的信息!\n",NUM);	}}//删除学生信息Mes *mes_del(Mes *p){	int i,j;	char NUM[10];	printf("请输入要删除的学生的学号:");	scanf("%s",NUM);	for(i=0;i<num;i++)	{		if(strcmp((p+i)->mes_num,NUM)==0)		{			for(;i<num;i++)			{				j=i+1;				strcpy((p+i)->mes_num,(p+j)->mes_num);				strcpy((p+i)->mes_name,(p+j)->mes_name);				(p+i)->mes_age=(p+j)->mes_age;				strcpy((p+i)->mes_class,(p+j)->mes_class);			}			num--;			printf("找到并删除该学生的信息!\n");			break;		}	}	return p;}//修改学生信息Mes *mes_change(Mes *p){	char NUM[10];	int i;	printf("请输入学生学号:");	scanf("%s",NUM);	for(i=0;i<num;i++)	{		if(strcmp((p+i)->mes_num,NUM)==0)		{			printf("请输入要修改的信息:\n");			printf("学号 姓名 年龄 班级 \n");			scanf("%s %s %d %s",(p+i)->mes_num,(p+i)->mes_name,&((p+i)->mes_age),(p+i)->mes_class);			break;		}	}	if(i<num)	{		printf("学号为%s的学生的信息已经修改!\n",NUM);	}else{			printf("没有学号为%s的学生的信息!\n",NUM);	}}//显示学生信息void mes_show(Mes *p){	int i;	printf("学号 姓名 年龄 班级 \n");	for(i=0;i<num;i++)	{		printf("%s %s %d %s\n",(p+i)->mes_num,(p+i)->mes_name,(p+i)->mes_age,(p+i)->mes_class);	}}int main(int argc,char *argv[]){	if(argc != 2)	{		perror("argv[1]1");		exit(1);	}	int fd;	Mes *mes;	Mes *p = MALLOC;	fd = open(argv[1],O_CREAT|O_RDWR,0777);	if(fd == -1)	{		perror("argv[1]2");		exit(1);	}	write(fd,p,sizeof(Mes));	lseek(fd,100*sizeof(Mes),SEEK_CUR);	write(fd,p,sizeof(Mes));	lseek(fd,0,SEEK_SET);	mes=(Mes*)mmap(NULL,sizeof(Mes)*100,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);	if(mes==MAP_FAILED){		perror("mmap failed!\n");	}	close(fd);	fd=open("message.txt",O_CREAT|O_RDWR,0777);	if(fd==-1){		perror("message.txt failed to open!\n");	}	int i=read(fd,&num,sizeof(int));	if(i<=0){		num=0;	}	close(fd);	char choose;	while(1)	{		printf("1->添加 2->删除 3->修改 4->查找 5->显示 0->退出\n");		choose=getchar();		switch(choose)		{			case '1':mes=mes_add(mes);break;			case '2':mes=mes_del(mes);break;			case '3':mes_change(mes);break;			case '4':mes_search(mes);break;			case '5':mes_show(mes);break;			case '0':printf("quit!\n");break;			default :printf("没有此选项!\n");		}		getchar();		printf("\n");		if(choose == '0'){  	                 break;  	                }else{  			continue;  		           }	}	fd=open("message.txt",O_RDWR);	if(fd== -1){		perror("message.txt open error!\n");		exit(1);	}	write(fd,&num,sizeof(int));	close(fd);	munmap(mes,sizeof(Mes)*100);	return 0;}#include<stdio.h>#include<std



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: