大风起兮90+ 发表于 2020-6-19 17:05:45

C++文件保存和读取错误

最近在做学生管理系统的大作业,在快要结束这次作业的时候遇到了麻烦。
先上代码
头文件
#include<iostream>
#include<string>
#include<vector>
using namespace std;

struct Scoring_standard
{
        string standard_name;
        double rate;
        double m_grade;

};

class Grade
{
public:
        //Grade();   //新的收获,析构函数和构造函数如何自己定义了那么一定需要初始化
        //~Grade();
        static string m_curriculum_ID;
        static string m_curriculum_name;
        void insert_stu_num(int num);
        void insert_stu_name(string name);
        void insert_sum(double sum);
        void dispaly();
        int get_num();
        string get_name();
        double get_sum();
        vector<Scoring_standard>m_scoring_standard;
private:
        string m_name;
        double m_sum_grade;
        int m_student_num;
};


类的实现cpp文件
#include<iostream>
#include<string>
#include<vector>
#include<iomanip>
#include"grade.h"
using namespace std;

string Grade::m_curriculum_ID="";
string Grade::m_curriculum_name="";

void Grade::insert_stu_name(string name)
{
        m_name=name;
}

void Grade::insert_stu_num(int num)
{
        m_student_num=num;
}

void Grade::insert_sum(double sum)
{
        m_sum_grade=sum;
}

double Grade::get_sum()
{
        return m_sum_grade;
}

int Grade::get_num()
{
        return m_student_num;
}

string Grade::get_name()
{
        return m_name;
}

void Grade::dispaly()
{
        int j;
        cout<<setw(10)<<get_num()<<setw(8)<<get_name();
        for(j=0;j<m_scoring_standard.size();j++)
        {
                cout<<setw(8)<<m_scoring_standard.m_grade;
        }
        cout<<setw(8)<<get_sum();
        cout<<endl;
}

主程序文件
#include<iostream>
#include<fstream>
#include <iomanip>
#include<string>
#include<vector>
#include"grade.h"
using namespace std;
vector<Grade>insert_gra(vector<Scoring_standard> sta);
vector<Scoring_standard> set_sta();
int main()
{
        int identity;
        string file_name;
        int n=0;
        int i;
        int j;
        int flag1=1;
        int flag2=1;
        int count=0;
        int menu_teacher1;
        vector<Scoring_standard>sta;
        vector<Grade>grade;
        Grade output;
        cout<<"请输入您的身份:(1.老师 2.学生)"<<endl;
        cin>>identity;
        if(identity==1)
        {
                cout<<"===============老师您好,欢迎使用成绩管理系统(老师版)=============="<<endl;
                cout<<"请您输入之前保存的成绩单名字:"<<endl;
                cin>>file_name;
        ifstream infile(file_name,ios::in|ios::binary);
        if(infile)
        {
                cout<<"成功打开成绩文件!"<<endl;
                cout<<"开始输出之前您输入的成绩信息"<<endl;
                while(infile.read((char *)&output, sizeof(output)))
                { //一直读到文件结束
                        output.dispaly();
                }
                infile.close();

        }
        else
        {
                cout<<"成绩单不存在!将新建一个成绩单!"<<endl;
                cout<<"==================课程信息录入=================="<<endl;
                cout<<"请输入课程名字:";
                cin>>Grade::m_curriculum_name;
                cout<<"请输入课程代码:";
                cin>>Grade::m_curriculum_ID;
                cout<<"==================成绩组成信息录入==============="<<endl;
                sta=set_sta();
                while(1)
                {
                        cout<<"目前成绩组成项目已录入完成:"<<endl;
                        cout<<"初始化菜单:1.修改项目 2.录入成绩"<<endl;
                        cin>>menu_teacher1;
                        if(menu_teacher1==1)
                        {
                                cout<<"=============您选择了重新录入项目和比率============"<<endl;
                                sta.clear();
                                sta=set_sta();
                        }
                        else if(menu_teacher1==2)
                        {
                                cout<<"=============录入学生成绩=============="<<endl;
                                grade=insert_gra(sta);
                                cout<<"=============成绩录入完成=============="<<endl;
                                for(i=0;i<grade.size();i++)
                                {
                                        grade.dispaly();
                                }
                                break;
                        }
                }
        }
        ofstream oFile;
        oFile.open(file_name,ios::out);
        if(!oFile)
        {
                cout<<"文件打开失败"<<endl;
                exit(0);
        }
        ofstream outFile(file_name,ios::out|ios::binary);
        for(i=0;i<grade.size();i++)
        {
                outFile.write((char*)&grade, sizeof(grade));
        }
        outFile.close();

        }
        return 0;
}

vector<Scoring_standard> set_sta()
{
        int i;
        int j;
        int flag1=1;
        double sum_rate=0;
        Scoring_standard insert1;
        vector<Scoring_standard>sta_temp(0);
        i=0;
        while(flag1)
        {
                i++;
                cout<<"请输入第"<<i<<"个评分项目的名字:";
                cin>>insert1.standard_name;
                cout<<"请输入第"<<i<<"个评分项目的所占比率:";
                cin>>insert1.rate;
                cout<<"要继续输入吗(1表示继续,0表示停止)";
                cin>>flag1;
                sta_temp.push_back(insert1);
                if(flag1==0)
                {
                        for(j=0;j<sta_temp.size();j++)
                        {
                                sum_rate=sum_rate+sta_temp.rate;
                        }
                        if(sum_rate!=1)
                        {
                                cout<<"您输入的评分项比率总和不为1,请继续输入!"<<endl;
                                flag1=1;
                        }
                        else if(sum_rate==1)
                        {
                                cout<<"评分项目总和为1,您可以开始登记成绩了!"<<endl;
                        }
                }
        }
        return sta_temp;
}


vector<Grade> insert_gra(vector<Scoring_standard> sta)
{
        int i;
        int j;
        int flag2=1;
        Grade insert2;
        insert2.m_scoring_standard=sta;
        vector<Grade>gra_temp(0);
        int temp_num;
        string temp_name;
        double temp_sum;
        i=0;
        while(flag2)
        {
                i++;
                temp_sum=0;
                cout<<"请输入第"<<i<<"个学生的学号:"<<endl;
                cin>>temp_num;
                insert2.insert_stu_num(temp_num);
                cout<<"请输入第"<<i<<"个学生的姓名:"<<endl;
                cin>>temp_name;
                insert2.insert_stu_name(temp_name);
                for(j=0;j<insert2.m_scoring_standard.size();j++)
                {
                        cout<<"请输入"<<insert2.m_scoring_standard.standard_name<<"项目的成绩(百分制):"<<endl;
                        cin>>insert2.m_scoring_standard.m_grade;
                        temp_sum=insert2.m_scoring_standard.m_grade*insert2.m_scoring_standard.rate+temp_sum;
                }
                insert2.insert_sum(temp_sum);
                gra_temp.push_back(insert2);
                cout<<"是否要继续录入(1/0):";
                cin>>flag2;
        }
        return gra_temp;
}


问题就是在我录入了课程信息,成绩组成项目以及学生成绩之后,可以正常输出我的成绩,但是当我将文件保存为二进制文件之后,重新打开程序读取数据,就只能输出学生的学号和姓名了,类的静态成员变量课程名,课程代码变成了在cpp文件中初始化的值,成绩组成结构体直接无法输出

大风起兮90+ 发表于 2020-6-19 17:07:20

错误如图

永恒的蓝色梦想 发表于 2020-6-19 17:45:50

拿代码格式发

jackz007 发表于 2020-6-19 19:14:12

本帖最后由 jackz007 于 2020-6-19 19:20 编辑

      这样发帖你的代码会丢东西,一部分代码内容会被作为页面格式控制指令被滤除,页面格式也会出现非预期的变化,导致版面很乱,解决问题的方法是把代码贴入代码框。
      把代码贴入代码框非常简单,只要按照下面的图片操作就可以成功。
页: [1]
查看完整版本: C++文件保存和读取错误