responsibility@L 2022-12-03 10:56 采纳率: 80%
浏览 31
已结题

C++学生成绩管理系统无法调用已保存数据(急急急)

成绩管理系统在save模块后如果关闭重新开始无法通过read功能直接调用已保存的数据,只显示一个学号。
听说是因为二进制导致的,能不能帮我换成fprintf和fclose形式?

img

#include <iostream>
#include <string>
#include <cstdlib>//exit
#include <iomanip>/tw()
#include<stdio.h>
using namespace std;

//创建结构体
typedef struct{
    public:
          int  num;//学号
        string name;//姓名
        double score;//成绩
}student;
typedef struct{
    student *elem;//存储空间的基地址
    int length;//表长度
}Sqlist;

//初始化
void init_stu(Sqlist &L){
    L.elem=new student[1000];//最多存储1000名学生信息
    if(L.elem==NULL) exit(0);
    L.length=0;
}

//表格标签
void table(){
    cout<<endl;
    cout<<setiosflags(ios::left)<<setw(20)<<"学号";
    cout<<setw(20)<<"姓名";
    cout<<setw(20)<<"成绩"<<endl;
    for(int a=0;a<20;a++){
        cout<<"-----";
    }
    cout<<endl;
}

//添加功能
void add(Sqlist &L){
    int i;
    cout<<"请入要添加的学生个数:";
    cin>>i;
    for(int j=0;j<i;j++){
            cout<<"请输入第"<<j+1<<"个学生的学号:";
            cin>>L.elem[L.length].num;
        cout<<"请输入第"<<j+1<<"个学生的姓名:";
        cin>>L.elem[L.length].name;
        cout<<"请输入第"<<j+1<<"个学生的成绩:";
        cin>>L.elem[L.length].score;
        L.length++;
    }

}

//显示功能
void output(Sqlist &L){
    table();
    for(int i=0;i<L.length;i++){
        cout<<setiosflags(ios::left)<<setw(20)<<L.elem[i].num;
        cout<<setw(20)<<L.elem[i].name;
        cout<<setw(20)<<L.elem[i].score<<endl;
    }
    for(int a=0;a<20;a++){
        cout<<"-----";
    }
    cout<<endl;
}

//选择菜单
void menu(){
    cout<<"****************************************************"<<endl;
    cout<<"             欢迎加入成绩管理系统                   "<<endl;
    cout<<"******1.数据录入           2.数据显示***************"<<endl;
    cout<<"******3.数据删除           4.数据排序***************"<<endl;
    cout<<"******5.数据分析           6.数据保存***************"<<endl;
    cout<<"******7.数据调入           8.成绩查询***************"<<endl;
    cout<<"******9.成绩统计(总分,平均分)********************"<<endl;
    cout<<"******10.退出系统***********************************"<<endl;
    cout<<"请选择功能号(1,2,3,4,5,6,7,8,9,10)"<<endl;

}

//删除功能
void del(Sqlist &L){
    string a;
    int flag=0;
    cout<<"请输入要删除的学生姓名:";
    cin>>a;
    for(int i=0;i<L.length;i++){
        if(L.elem[i].name==a){
            flag++;
//            cout<<i<<endl;
            for(i;i<L.length;i++){
                L.elem[i]=L.elem[i+1];
                L.length--;
                cout<<"删除成功"<<endl;
            }
        }
    }
    if(flag==0){
        cout<<"没有该找到学生信息,无法进行删除"<<endl;
    }
}


//分类功能
void alter(Sqlist &L){
    int num;
    for(int i=0;i<L.length;i++)
    {if (L.elem[i].score>=90 && L.elem[i].score<=100)
        cout <<L.elem[i].name<<"    "<<L.elem[i].score<< "优秀"<<endl;
    else if (L.elem[i].score>=80 && L.elem[i].score<=89)
        cout <<L.elem[i].name<<"    "<<L.elem[i].score<< "良好"<<endl;
    else if (L.elem[i].score>=70 && L.elem[i].score<=79)
        cout<<L.elem[i].name<<"    "<<L.elem[i].score << "中等"<<endl;
    else if (L.elem[i].score>=60 && L.elem[i].score<=69)
        cout <<L.elem[i].name<<"    "<<L.elem[i].score<< "及格"<<endl;
    else if (L.elem[i].score>=0 && L.elem[i].score<=59)
        cout <<L.elem[i].name<<"    "<<L.elem[i].score<< "不及格"<<endl;
    else
        cout << "成绩不合规";}
}
void lookup1(Sqlist &L,int a){
    table();
    for(int e=0;e<L.length;e++){
        if(L.elem[e].num==a){
        cout<<setiosflags(ios::left)<<setw(20)<<L.elem[e].num;
        cout<<setw(20)<<L.elem[e].name;
        cout<<setw(20)<<L.elem[e].score<<endl;
    }
}
    for(int a=0;a<20;a++){
        cout<<"-----";
    }
    cout<<endl;
}
void lookup2(Sqlist &L,string a){
    table();
    for(int e=0;e<L.length;e++){
        if(L.elem[e].name==a){
        cout<<setiosflags(ios::left)<<setw(20)<<L.elem[e].num;
        cout<<setw(20)<<L.elem[e].name;
        cout<<setw(20)<<L.elem[e].score<<endl;
    }
}
    for(int a=0;a<20;a++){
        cout<<"-----";
    }
    cout<<endl;
}
void save(Sqlist &L)
{
    FILE *fp = fopen("t.txt", "wb");
    fwrite(&L.length, 1, sizeof(L.length), fp);
    fwrite(L.elem, L.length, sizeof(student), fp);
    fclose(fp);
}

void read(Sqlist &L)
{
    FILE *fp = fopen("t.txt", "rb");
    fread(&L.length, 1, sizeof(L.length), fp);
    L.elem = new student[L.length];
    fread(L.elem, L.length, sizeof(student), fp);
    fclose(fp);
}
void sort(Sqlist &L)
{    int num;

     student temp;
    for(int i=L.length;i>0;i--){
        for(int j=0;j<L.length-1;j++){
            if(L.elem[j].score>L.elem[j+1].score){
                temp=L.elem[j];
                L.elem[j]=L.elem[j+1];
                L.elem[j+1]=temp;
            }
        }
    }
    //输出排序
     cout<<"姓名    成绩"<<endl;
     for(int i=0;i<L.length;i++){
         cout<<L.elem[i].num<<"   "<<L.elem[i].name<<"    "<<L.elem[i].score<<endl;
     }
     system("pause");


}

//主函数
int main(){
    int num=0,m,b;
    string u,v;
    int a=1;
    Sqlist M;
    init_stu(M);

    while(a){
        menu();//菜单选择页面
        cout<<"请输入您的选择:";
        cin>>num;
        switch(num){
            case 1:
                add(M);//添加学生信息
                break;
            case 2:
                output(M);//显示所有学生的信息
                system("pause");
                break;
            case 3:
                del(M);//按姓名进行删除指定学生信息
                system("pause");
                break;
                  case 4:
                       cout<<"排序结果为"<<endl;
                       sort(M);
                       break;
            case 5:
                cout<<"成绩分类"<<endl;
                alter(M);//按照姓名重新修改指定学生信息
                system("pause");
            case 6:
                cout<<"数据保存"<<endl;
                save(M);
                break;
            case 7:
                cout<<"数据调入"<<endl;
                read(M);
                break;
                break;
            case 10://退出当前使用的成绩管理系统
                cout<<"成功退出成绩管理系统"<<endl;
                a=0;
                break;

                  case 8:cout<<"1.按学号查找  2.按姓名查找"<<endl;
                         cin>>b;
                         switch(b)
                        {case 1:cout<<"学号为"<<endl;
                                cin>>m;
                                lookup1(M,m);
                                system("pause");
                                break;
                         case 2: cout<<"姓名为"<<endl;
                                cin>>u;
                                lookup2(M,u);
                                system("pause");
                                break;
                                default:break;
                              }

            default:break;
        }
        system("cls");
    }
    system("pause");
    return 0;
}


  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2022-12-03 11:42
    关注

    结构体里有string,是不能用sizeof来计算结构体长度的。string改成字符数组,比如char name[20]这样才可以

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月11日
  • 已采纳回答 12月3日
  • 修改了问题 12月3日
  • 修改了问题 12月3日
  • 展开全部

悬赏问题

  • ¥15 高价求中通快递查询接口
  • ¥15 解决一个加好友限制问题 或者有好的方案
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?