怎么实现C自动保存数据?目前只学了C程序设计

做的简单的教师信息管理系统,无法实现数据自动保存跟读写,只能手动

将添加的信息写到文件中保存,等程序下次启动时从文件中读取。

我之前写了一个成绩管理系统的代码,基本都是一样的,只是需要把学生结构体换成教师结构体,你参考着改一下就可以了


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//定义学生的最大数量
#define <span class="hljs-symbol">MAXNMB</span> <span class="hljs-number">50</span>
//定义课程数量
#define <span class="hljs-symbol">NMBKC</span> <span class="hljs-number">5</span>
struct <span class="hljs-symbol">Student</span>
{
    int number;      //学号
    char name[<span class="hljs-number">20</span>];   //姓名
    int score[<span class="hljs-symbol">NMBKC</span>];//保存课程成绩
    float avg;       //平均分
    int mc;          //名次
};

//解析文件中的一行数据
int <span class="hljs-symbol">ParserStr</span>(char* buf,char out[<span class="hljs-symbol">NMBKC</span>][<span class="hljs-number">20</span>])
{
    int i = <span class="hljs-number">0</span>;
    int j = <span class="hljs-number">0</span>,m = <span class="hljs-number">0</span>;;
    char prech = <span class="hljs-string">'a'</span>;
    //去掉开头的空格
    while(buf[i] == <span class="hljs-string">' '</span>)
        i++;
    while(buf[i] != <span class="hljs-string">'\0'</span>)
    {
        if (buf[i] == <span class="hljs-string">'\n'</span> && prech != <span class="hljs-string">' '</span>)
        {
            out[j][m] = <span class="hljs-string">'\0'</span>;
            //printf(<span class="hljs-string">"%d  %s\n"</span>,j,out[j]);
            prech = <span class="hljs-string">' '</span>;
            m = <span class="hljs-number">0</span>;
            j++;
            i++;
        }else if(buf[i] == <span class="hljs-string">' '</span> && prech != <span class="hljs-string">' '</span>)
        {
            out[j][m] = <span class="hljs-string">'\0'</span>;
            //printf(<span class="hljs-string">"%d  %s\n"</span>,j,out[j]);
            prech = <span class="hljs-string">' '</span>;
            m = <span class="hljs-number">0</span>;
            j++;
            i++;
        }else if (buf[i] == <span class="hljs-string">' '</span> && prech == <span class="hljs-string">' '</span>)
        {
            i++;
        }else
        {
            out[j][m] = buf[i];
            prech = buf[i];
            m++;
            i++;
        }
    }
    if (j== <span class="hljs-symbol">NMBKC</span>+<span class="hljs-number">2</span>)
    {
        return <span class="hljs-number">1</span>;
    }else
        return <span class="hljs-number">0</span>;
}
//读取文件
void <span class="hljs-symbol">ReadFile</span>(struct <span class="hljs-symbol">Student</span> stu[],int *nmb,char kecheng[][<span class="hljs-number">20</span>])
{
    int i = <span class="hljs-number">0</span>,j = <span class="hljs-number">0</span>;
    char buf[<span class="hljs-number">100</span>] = {<span class="hljs-number">0</span>};
    char tmp[<span class="hljs-symbol">NMBKC</span>+<span class="hljs-number">2</span>][<span class="hljs-number">20</span>] = {<span class="hljs-number">0</span>};
    int t;
    <span class="hljs-symbol">FILE</span>* fp;
    errno_t err;
    if ((err = fopen_s(&fp,<span class="hljs-string">"a.txt"</span>,<span class="hljs-string">"r"</span>)) != <span class="hljs-number">0</span>)
    {
        printf(<span class="hljs-string">"文件读取失败\n"</span>);
        return ;
    }
    //读取文件
    //第一行数据
    fgets(buf,<span class="hljs-number">100</span>,fp);
    //解析数据
    <span class="hljs-symbol">ParserStr</span>(buf,tmp); //解析出课程名称
    for (j =<span class="hljs-number">0</span>;j < <span class="hljs-symbol">NMBKC</span>;j++)
    {
        strcpy_s(kecheng[j],<span class="hljs-number">20</span>,tmp[j+<span class="hljs-number">2</span>]);
    }
    while(!feof(fp))
    {
        memset(buf,<span class="hljs-number">0</span>,<span class="hljs-number">100</span>);
        fgets(buf,<span class="hljs-number">100</span>,fp); //读取一行
        //避免最后一行直接结束
        if(buf[strlen(buf)<span class="hljs-number">-1</span>] != <span class="hljs-string">'\n'</span>)
            buf[strlen(buf)] = <span class="hljs-string">' '</span>;
        memset(tmp,<span class="hljs-number">0</span>,sizeof(tmp));
        if(<span class="hljs-symbol">ParserStr</span>(buf,tmp))
        {
            stu[i].number = atoi(tmp[<span class="hljs-number">0</span>]);
            strcpy_s(stu[i].name,<span class="hljs-number">20</span>,tmp[<span class="hljs-number">1</span>]);
            stu[i].avg = <span class="hljs-number">0.0</span>;
            for(t = <span class="hljs-number">0</span>;t < <span class="hljs-symbol">NMBKC</span>;t++)
            {
                stu[i].score[t] = atoi(tmp[<span class="hljs-number">2</span>+t]);
                stu[i].avg += stu[i].score[t];
            }
            stu[i].avg /= <span class="hljs-symbol">NMBKC</span>;
            i++;
        }
    }
    fclose(fp);
    *nmb = i;
    //printf(<span class="hljs-string">"总学生数:%d\n"</span>,i);
}

//按平均分排名并写入文件
void <span class="hljs-symbol">SortByavg</span>(struct <span class="hljs-symbol">Student</span> stu[],int nmb,char kecheng[][<span class="hljs-number">20</span>])
{
    int i,j;
    errno_t err;
    struct <span class="hljs-symbol">Student</span> tmp;
    char* xh =<span class="hljs-string">"学号"</span>;
    char* xm =<span class="hljs-string">"姓名"</span>;
    char* pjf =<span class="hljs-string">"平均分"</span>;
    char* pm=<span class="hljs-string">"排名"</span>;
    <span class="hljs-symbol">FILE</span>* fp;
    printf(<span class="hljs-string">"%-6s%-8s"</span>,xh,xm);
    for(i=<span class="hljs-number">0</span>;i<<span class="hljs-symbol">NMBKC</span>;i++)
        printf(<span class="hljs-string">"%-10s"</span>,kecheng[i]);
    printf(<span class="hljs-string">"%-10s%-10s\n"</span>,pjf,pm);
    for (i = <span class="hljs-number">0</span>;i< nmb<span class="hljs-number">-1</span>;i++)
    {
        for (j = <span class="hljs-number">0</span>;j<nmb<span class="hljs-number">-1</span>-i;j++)
        {
            if(stu[j].avg < stu[j+<span class="hljs-number">1</span>].avg)
            {
                tmp = stu[j];
                stu[j] = stu[j+<span class="hljs-number">1</span>];
                stu[j+<span class="hljs-number">1</span>] = tmp;
            }
        }
    }
    //屏幕显示
    j = <span class="hljs-number">1</span>;
    for (i = <span class="hljs-number">0</span>;i<nmb;i++)
    {
        if (i == <span class="hljs-number">0</span>)
        {
            stu[i].mc = <span class="hljs-number">1</span>;
            printf(<span class="hljs-string">"%-6d%-10s%-10d%-10d%-10d%-10d%-10d%.2f%5d\n"</span>,stu[i].number,stu[i].name,stu[i].score[<span class="hljs-number">0</span>],stu[i].score[<span class="hljs-number">1</span>],stu[i].score[<span class="hljs-number">2</span>],stu[i].score[<span class="hljs-number">3</span>],stu[i].score[<span class="hljs-number">4</span>],stu[i].avg,j);
        }else
        {
            if(stu[i].avg != stu[i<span class="hljs-number">-1</span>].avg)
                j++;
            stu[i].mc = j;
            printf(<span class="hljs-string">"%-6d%-10s%-10d%-10d%-10d%-10d%-10d%.2f%5d\n"</span>,stu[i].number,stu[i].name,stu[i].score[<span class="hljs-number">0</span>],stu[i].score[<span class="hljs-number">1</span>],stu[i].score[<span class="hljs-number">2</span>],stu[i].score[<span class="hljs-number">3</span>],stu[i].score[<span class="hljs-number">4</span>],stu[i].avg,j);
        }
    }
    //写文件
    if ((err = fopen_s(&fp,<span class="hljs-string">"file2.txt"</span>,<span class="hljs-string">"w"</span>)) != <span class="hljs-number">0</span>)
    {
        printf(<span class="hljs-string">"文件打开失败\n"</span>);
        return;
    }
    //屏幕显示
    fprintf(fp,<span class="hljs-string">"%-6s%-8s"</span>,xh,xm);
    for(i=<span class="hljs-number">0</span>;i<<span class="hljs-symbol">NMBKC</span>;i++)
        fprintf(fp,<span class="hljs-string">"%-10s"</span>,kecheng[i]);
    fprintf(fp,<span class="hljs-string">"%-10s%-10s\n"</span>,pjf,pm);
    j = <span class="hljs-number">1</span>;
    for (i = <span class="hljs-number">0</span>;i<nmb;i++)
    {
        if (i == <span class="hljs-number">0</span>)
        {
            fprintf(fp,<span class="hljs-string">"%-6d%-10s%-10d%-10d%-10d%-10d%-10d%.2f%5d\n"</span>,stu[i].number,stu[i].name,stu[i].score[<span class="hljs-number">0</span>],stu[i].score[<span class="hljs-number">1</span>],stu[i].score[<span class="hljs-number">2</span>],stu[i].score[<span class="hljs-number">3</span>],stu[i].score[<span class="hljs-number">4</span>],stu[i].avg,j);
        }else
        {
            if(stu[i].avg != stu[i<span class="hljs-number">-1</span>].avg)
                j++;
            fprintf(fp,<span class="hljs-string">"%-6d%-10s%-10d%-10d%-10d%-10d%-10d%.2f%5d\n"</span>,stu[i].number,stu[i].name,stu[i].score[<span class="hljs-number">0</span>],stu[i].score[<span class="hljs-number">1</span>],stu[i].score[<span class="hljs-number">2</span>],stu[i].score[<span class="hljs-number">3</span>],stu[i].score[<span class="hljs-number">4</span>],stu[i].avg,j);
        }
    }
    fclose(fp);
}