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:使用指定的映射起始地址

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