Linuxc高级编程之文件系统大作业

假设一个学生的信息包括姓名,学号,性别,年龄,班级,籍贯六项信息,编写一个简单的学生管理系统:

源代码:

#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[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<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);
                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 <sys/mman.h>
函数原型
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:使用指定的映射起始地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章