Linux下学生信息管理系统文件存储( 基于低级文件操作,无缓冲区)

9 篇文章 0 订阅
7 篇文章 0 订阅

Linux下学生信息管理系统链表、文件存储( 基于低级文件操作,无缓冲区)

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>

int HomePage(void);
void Add(void);
void Print();
void Delete(void);
void Updata(void);
void Sort(void);
void Query(void);
void SaveDataToFile();

typedef struct Student
{
    int num;
    char name[20];
    float score;
    struct Student *next;
}StuNode;

StuNode *Head = NULL;
int CountReadBytes = 0;// 统计读得字节数
int CountWriteBytes = 0;// 统计写的字节数

int main(void)
{
    int fd=-1;  // 文件标识符
    int ret=-1; // 文件读写字节数

    StuNode *p = NULL;

    Head = (StuNode*)malloc(sizeof(StuNode)); //手动分配sizeof(StuNode)大小的内存空间
    Head->next = NULL;
    p = Head;

    // fd=open("b.txt",O_RDWR|O_CREAT|O_APPEND,0666);
    fd=open("b.txt",O_RDWR|O_CREAT,0666);

    /* 创建链表、并从文件里读取数据到链表*/
    do
    {
        p->next = (StuNode*)malloc(sizeof(StuNode)); //手动分配sizeof(StuNode)大小的内存空间
        // p = p->next;
        lseek(fd,0,SEEK_CUR);
        ret = read(fd,p->next,sizeof(StuNode));
        CountReadBytes += ret;
        if (0 == ret)
        {
            free(p->next);
            p->next = NULL;
            break;
        }
        p = p->next;
    }
    while (ret);
    // p = NULL;

    printf("TotalRead %d*40 byte\n",CountReadBytes/40);
    close(fd);



    while (1)
    {
        int op = HomePage();
        switch (op)
        {
        case 1:
            system("clear");//清屏函数
            Add();
            break;
        case 2:
            system("clear");
            Delete();
            break;
        case 3:
            system("clear");
            Updata();
            break;
        case 4:
            system("clear");//
            Query();
            break;
        case 5:
            system("clear");
            Sort();
            break;
        case 6:
            system("clear");
            Print();
            break;
        case 0:SaveDataToFile();
            return 0;

        default:
            printf("请输入序号为0~6的选项!!");
        }
    }
}
/*
函数功能: 使用文件保存学生数据.
参数: 无
返回值 : 无
*/
void SaveDataToFile()
{
    int fd = -1;

    StuNode *p = NULL;
    fd=open("b.txt",O_RDWR|O_CREAT|O_TRUNC,0666);

    p= Head;
    while (p->next)
    {
        p = p->next;
        lseek(fd,0,SEEK_CUR);
        CountWriteBytes += write(fd,p,sizeof(StuNode));
    }

    printf("TotalWrite %d*40 byte\n",CountWriteBytes/40);

    close(fd);    
}

/*
函数功能: 采用用插入排序,将每条插入的数据的成绩与其他数据进行比较,降序排列.
参数: 无
返回值 : 无
*/
void Sort(void)
{
    printf("*************************************************\n");
    printf("*  采用用插入排序,添加数据时已按照成绩降序排列  *\n");
    printf("*************************************************\n");

    printf("\n");
    printf("\n");
}

/*
函数功能: 查询指定学生信息
参数: 无
返回值 : 无
*/
void Query(void)
{
    int query_Stu_num;
    StuNode *p = Head;
    printf("请输入要查询的学生的学号:\n");
    scanf("%d", &query_Stu_num);

    while (p->next)
    {
        p = p->next;
        if (query_Stu_num == p->num)
        {
            printf("%d\t%s\t%.1f\n", p->num, p->name, p->score);
            return;
        } 
    }

}

/*
函数功能: 修改学生信息
参数: 无
返回值: 无
*/
void Updata(void)
{
    int num_updata, changeFlag = 1, i;
    StuNode *p = Head;
    printf("请输入该学生的学号:\n");
    scanf("%d", &num_updata);

    while (p->next)
    {
        p = p->next;
        if (num_updata == p->num)
        {
            printf("\033[31m%d\t\t%s\t\t%.1f\n\033[0m", p->num, p->name, p->score);
            break;
        }
    }

    while(1)
    {
        printf("请选择要修改的信息项(0--停止修改, 1--学号,2--姓名,3--成绩 ,默认为3):\n");
    loop:
        scanf("%d", &changeFlag);

        switch (changeFlag)
        {
            case 1:
                printf("请输入修改的学号:\n");
                scanf("%d", &p->num);
                printf("\033[31m%d\033[0m\t\t%s\t\t%.1f\n", p->num, p->name, p->score);
                break;
            case 2:
                printf("请输入修改的姓名:\n");
                scanf("%s", p->name);
                printf("%d\t\t\033[31m%s\033[0m\t\t%.1f\n", p->num, p->name, p->score);
                break;
            case 3:
                printf("请输入修改的成绩:\n");
                scanf("%f", &p->score);
                printf("%d\t\t%s\t\t\033[31m%.1f\033[0m\n", p->num, p->name, p->score);
                break;
            case 0:
                printf("\033[31m 修改成功! \033[0m\n");
                return;

            default:
                printf("\033[31m 输入不合法! 请重新输入!:\033[0m\n");
                goto loop;
                break;
        }
    }

}

/*
函数功能 : 删除学生信息
参数: 无
返回值: 无
*/
void Delete(void)
{
    StuNode *p = Head,*dele = NULL;
    int num_dele;
    printf("请输入学号:\n");
    scanf("%d", &num_dele);

    while (p->next)
    {
        if (num_dele == p->next->num)
        {
            dele = p->next;
            p->next = dele->next;

            free(dele);  // 释放删除的节点所占有的空间

            printf("\033[31m 删除成功!\033[0m\n");
            Print();
            
            dele = NULL;
            return;
        }
        p = p->next;
    }

    if (p->next == NULL)
    {
        printf("\033[31m 该记录不存在!!!\033[0m\n");
    }
    
    Print();
}

/*
函数功能: 遍历学生信息
参数: 无
返回值: 无
*/
void Print()
{
    StuNode *p;
    printf("学号\t\t姓名\t\t成绩\n");

    p = Head;
    while (p->next)
    {
        p = p->next;
        printf("%d\t\t%s\t\t%.1f\n", p->num, p->name, p->score);
        
    }
}

/*
函数功能: 添加学生信息
参数: 无
返回值: 无
*/
void Add(void)
{
    char  ch; // 是否继续输入选项标识符
    StuNode *temp = NULL; // 中间变量
    StuNode *p = NULL;

    printf("请输入学号:\n");
    
    input: 
        temp = (StuNode*)malloc(sizeof(StuNode)); // 中间变量
        temp->next = NULL;
        
        p = Head;

        scanf("%d",&temp->num);

        while (p->next)
        {
            p = p->next;
            if (temp->num == p->num)
            {
                printf("该记录已存在!请重新输入:");
                free(temp);

                goto input;
            }
            
        }

        printf("请输入姓名:\n");
        scanf("%s",temp->name);

        printf("请输入成绩:\n");
        scanf("%f",&temp->score);

        getchar();

    p = Head;
    while (p->next)
    {
        // p = p->next;
        if(temp->score > p->next->score)
        {
                temp->next = p->next;
                p->next = temp;

                printf("是否继续添加?:   是(Y)   否(N)\n");
                scanf("%c",&ch);
                getchar();

                if (ch == 'Y' || ch == 'y')
                {
                    goto input;
                }
                printf("\033[31m 添加成功!\033[0m\n");
                Print();
                return;
        } 
        p = p->next;
    }
    // p->next = temp;
    // temp->next = NULL;
    
        p->next = temp;
        p = p->next;
        p->next = NULL;
        temp = NULL;

    
    // printf("学号\t姓名\t成绩\n");
    // p = Head;
    // while (p->next)
    // {
    //     p = p->next;
    //     printf("%d\t%s\t%.1f\n",p->num,p->name,p->score);
    // }
}

/*
函数功能: 显示学生信息管理系统主页面可选项
参数:无
返回值: 返回功能选项的序号
*/
int HomePage(void)
{
    int op;

    printf("************学生信息管理系统*************\n");
    printf("*******    1.添加学生信息    **********\n");
    printf("*******    2.删除学生信息    **********\n");
    printf("*******    3.修改学生信息    **********\n");
    printf("*******    4.查询学生信息    **********\n");
    printf("*******    5.排序学生信息    **********\n");
    printf("*******    6.遍历学生信息    **********\n");
    printf("*******    0.退出系统       **********\n");

    printf("\n\n请输入选项:\n");
    scanf("%d", &op);
    if(op < 0 || op > 6)
        printf("\033[31m 请输入数字0~6!:\033[0m\n");

    return op;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值