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文件中初始化的值,成绩组成结构体直接无法输出 错误如图 拿代码格式发 本帖最后由 jackz007 于 2020-6-19 19:20 编辑
这样发帖你的代码会丢东西,一部分代码内容会被作为页面格式控制指令被滤除,页面格式也会出现非预期的变化,导致版面很乱,解决问题的方法是把代码贴入代码框。
把代码贴入代码框非常简单,只要按照下面的图片操作就可以成功。
页:
[1]