//以一个学生信息管理系统为例
#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;
}