学生成绩管理系统中文件内数据调用问题

#关于如何将数据储存在文件中,并对数据进行修改
首先将数据保存文件中:**

int cover_date(int *len,struct student *p)//int *len接受输入时的元素个数
{
    int i;
    FILE *fp;
    if((fp=fopen("student.dat","wb+"))==NULL)
    {
        printf("open file error\n");
        return -1;
    }
    for(i=0; i<*len; i++)
    {
        if(p[i].score==-1)
        {
            continue;
        }
        fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%d\n",p[i].xuehao,p[i].name,p[i].Chinese,p[i].math,p[i].English,p[i].score);
    }
    fclose(fp);//关闭
    getch();
    return 0;
    }

再读取文件中的数据,将其保存在定义的结构体中:


void  set_student_data(int *len,struct student p[])//读取文件,并赋值给变量*len
{
    FILE *fp = NULL;
    int i=0;
    fp = fopen("student.dat","r");
    if(fp==NULL)
    {
        printf("文件打开失败");
    }
    while(!feof(fp))
    {
        fscanf(fp,"%d %s %d %d %d %d ",&p[i].xuehao,p[i].name,&p[i].Chinese,&p[i].math,&p[i].English,&p[i].score);
        i++;
    }
    *len=i;//将文件中的元素个数保存在指针len中,作为其他函数的for循环次数限制
}

将读取的数据放在主函数while循环前:

int main()
{
    while(1)
    {
        set_student_data(&actual_len,student);//每一次重新开始,变量actual_len都将获得一个新的数值。
        print_student_data(student);//测试函数,打印文件数据,测试所读取的数据是否正常
       

此时在进行函数调用,例如:

  switch(x)
        {
        case 1:
            input(&actual_len,&student[0]);
            break;
        case 2:
            del(&actual_len,&student[0]);
            break;
        case 3:
            find(&actual_len,&student[0]);
            break;
        

之后的操作,如删除、修改、等,会改变数据的函数调用则需要对文件中所保存的数据进行更新,我在这里采用了覆盖的想法重新对结构体进行重新储存,于是直接在这些函数为调用了save函数

    save(len,&student[0]);//调用save函数保存对信息的修改
    print_student_data(len,&p[0]);//再次打印文件中数据,查看是否删除成功
    printf("学生信息删除已完成\n");
    printf("按回车键继续");
    getch();
}

以上便是在学生成绩管理系统编写中遇到的最大的问题,主要是对指针及结构体的运用并不熟练。在前几次失败的成品中定义的储存元素个数的指针len及数据的结构体均为空的变量,经高手指点在主函数调用了读取函数,问题才迎刃而解。

在C语言的学习中遇到的其他问题:

#C语言的错误警告1:warning: format ‘%s’ expects argument of type ‘char ', but argument 2 has type 'char ()[20]’ [-Wformat=]:格式“%s”要求参数的类型为“char*”,但参数2的类型为“char(*)[20]”[-Wformat=]

 printf("\t请输姓名:");
        scanf("%s",&p[i].name);//这里错误的使用了取地址符号&

p[i].name作为一个字符串变量本身就是一个地址,所以可以直接存储输入的内容,无需加&

#C语言的错误警告2:warning: implicit declaration of function ‘save’; [-Wimplicit-function-declaration]|:函数“save”的隐式声明;[-Wimplicit函数声明]|
这里只需将被调用函数移到函数前即可。

#C语言的错误3:这里也有一个让我哭笑不得的问题,读取文件时,程序总是直接结束。一直找了很久的错误,终于发现是文件打开失败,造成程序结束;高手和我都检查了很久怎么会打开失败,结果突然发现是文件名写错了!!!!!忍不住笑了!

以上问题虽小却常常忽略,还是需要提高注意

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值