假设一个学生的信息包括姓名,学号,性别,年龄,班级,籍贯六项信息,编写一个简单的学生管理系统:
源代码:
#include
#include
#include
#include
#include
#include
#include
#define MALLOC (Stu*)malloc(sizeof(Stu))
static int num = 0;
typedef struct{
char stu_num[10];
char stu_name[10];
int stu_age;
char stu_class[10];
char stu_sex[5];
char stu_jiguan[20];
}Stu;
//添加学生信息
Stu *stu_add(Stu *p)
{
int i;
printf("学号 姓名 年龄 班级 性别 籍贯\n ");
scanf("%s%s%d%s%s%s",(p+num)->stu_num,(p+num)->stu_name,&((p+num)->stu_age),
(p+num)->stu_class,(p+num)->stu_sex,(p+num)->stu_jiguan);
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("\t%s %s %d %s %s %s\n",(p+i)->stu_num,(p+i)->stu_name,(p+i)->stu_age,(p+i)->stu_class,(p+i)->stu_sex,(p+i)->stu_jiguan);
break;
}
i++;
}
if(i >= num)
{
printf("没有学号为:%s学生的信息\n",Num);
}
}
//删除学生信息
Stu *stu_del(Stu *p)
{
int i,j,count=0;
char Num[10];
printf("请输入要删除学生的学号:");
scanf("%s",Num);
for(i = 0;i < num;i++)
{
if(strcmp((p+i)->stu_num,Num)==0)
{
for(;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);
strcpy((p+i)->stu_sex,(p+j)->stu_sex);
strcpy((p+i)->stu_jiguan,(p+j)->stu_jiguan);
}
num--;
count = 1;
printf("找到并删除该学生信息\n");
break;
}
}
if(count != 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%s%s",(p+i)->stu_num,(p+i)->stu_name,&((p+i)->stu_age),
(p+i)->stu_class,(p+i)->stu_sex,(p+i)->stu_jiguan);
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("show :学号 姓名 年龄 班级 性别 籍贯\n");
for(i = 0;i < num;i++)
{
printf("\t%s %s %d %s %s %s\n",(p+i)->stu_num,(p+i)->stu_name,
(p+i)->stu_age,(p+i)->stu_class,(p+i)->stu_sex,(p+i)->stu_jiguan);
}
printf("已经显示全部信息\n");
}
}
int main(int argc,char *argv[])
{
if(argc != 1){
perror("argv[0]");
exit(1);
}
int fd;
Stu *stu;
Stu *q = MALLOC;
fd = open("stu.txt",O_CREAT|O_RDWR,00777);
if(fd == -1){
perror("open stu_txt failed");
exit(1);
}
lseek(fd,20*sizeof(Stu),SEEK_CUR);
write(fd,q,sizeof(Stu));
lseek(fd,0,SEEK_SET);
stu = (Stu*)mmap(NULL,sizeof(Stu)*20,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(stu == MAP_FAILED){
perror("mmap failed!\n");
}
close(fd);
fd = open("num.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("num.txt",O_RDWR);
if(fd == -1){
perror("num.txt open error!\n");
exit(1);
}
write(fd,&num,sizeof(int));
close(fd);
munmap(stu,sizeof(Stu)*100);
return 0;
}
所用函数
1.mmap()函数
功能
mmap将一个文件或者其它对象映射进内存
文件被映射到多个页上
如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零
头文件
#include
函数原型
void *mmap(void *start, size_t length, int prot, int flags, int fildes, off_t off);
返回值
成功执行时,返回被映射区的指针
失败时,mmap()返回MAP_FAILED
参数说明
start:映射区的开始地址
length:映射区的长度
prot:期望的内存保护标志,不能与文件的打开模式冲突,取值类型如下(可通过or运算合理地组合在一起)
PROT_EXEC //页内容可以被执行
PROT_READ //页内容可以被读取
PROT_WRITE //页可以被写入
PROT_NONE //页不可访问
flags:控制变化如何影响映射区
MAP_PRIVATE:映射区的写入不会影响到原文件
MAP_SHARED:映射区变化对文件有效
MAP_FIXED:使用指定的映射起始地址