最近受好友之托帮他写了个学生选课系统作为课程设计(C++写的),在写入文件那儿没什么事,但是在读取文件的时候就有事了,代码如下:(当输入学号后按回车出现“"0x0040220b"指令引用的"0x00000000"内存。该内存不能为"read"。”的对话框)。本人初学者,不是很懂,还望各位大侠多多指教,小人感激不尽!!!!!
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int Count=1;
struct stcStudent
{
int stunum;
string stuname;
int nelenum[50]; //已选课程的编号
int nele; //已选课程的数量
};
struct stcCouse
{
int counum;
string couname;
int score;
int nelepeo; //课程已选人数
int melepeo; //课程人数上限
};
class Student
{
public:
Student();
stcStudent stcstu;
Student* Snext;
};
class Couse
{
public:
Couse();
stcCouse stccou;
Couse* Cnext;
};
Student::Student()
{
stcstu.stunum =0;
stcstu.stuname="nobody";
stcstu.nele=0;
Snext=NULL;
for(int i=0;i<50;i++)
stcstu.nelenum[i]=0;
}
Couse::Couse()
{
stccou.counum=0;
stccou.couname="nothing";
stccou.score=0;
stccou.nelepeo=0;
stccou.melepeo=0;
Cnext=NULL;
}
//以下是要用的函数声明
void ResetStuInfo();
void ResetCouInfo();
Student* ReadStuInfo();
Couse* ReadCouInfo();
void SelectCouse(Student* s);
void DeleteCouse(Student* s);
//以下是主函数
int main()
{
int i;
char h='n';
cout<<"是否重置以前的学生选课信息?(y/n)"<<endl;
cin>>h;
if(h=='y')
ResetStuInfo();
cout<<endl<<"是否重置可选课程信息?(y/n)"<<endl;
cin>>h;
if(h=='y')
ResetCouInfo();
cout<<endl<<"a.登陆选课系统 e.退出"<<endl;
cin>>h;
if(h=='e')
return 0;
if(h=='a')
{
int stuNum;
char n='a';
Student* headStuInfo=ReadStuInfo();
Student* pStuInfo=headStuInfo;
Couse* headCouInfo=ReadCouInfo();
cout<<endl<<"请输入学号:";
cin>>stuNum;
while(pStuInfo->stcstu.stunum!=stuNum) //调试的时候显示就是这儿有问题
{
pStuInfo=pStuInfo->Snext;
}
if(pStuInfo->stcstu.nele!=0)
{
cout<<endl<<"已选课程的编号有:"<<endl;
for(i=0;i<pStuInfo->stcstu.nele;i++)
cout<<pStuInfo->stcstu.nelenum[i]<<endl;
}
cout<<endl<<"x.选课 d.删除已选课程 e.退出"<<endl;
cin>>n;
while(1)
{
if(n=='x')
SelectCouse(pStuInfo);
if(n=='d')
DeleteCouse(pStuInfo);
if(n=='e')
break;
}
ofstream outfile("StuInfo.dat",ios::binary);
if(!outfile)
{
cerr<<"写入学生信息出错!"<<endl;
abort();
}
for(i=0;i<3;i++)
outfile.write((char*)&headStuInfo->stcstu,sizeof(headStuInfo->stcstu));
outfile.close();
return 0;
}
return 0;
}
//以下是各个模块函数的实现
void ResetStuInfo() //重置学生信息函数
{
int i;
Student stu[3];
for(i=1;i<=3;i++)
{
stu[i-1].stcstu.stunum=i;
}
stu[0].stcstu.stuname="学生甲";
stu[1].stcstu.stuname="学生乙";
stu[2].stcstu.stuname="学生丙";
ofstream outfile("StuInfo.dat",ios::binary);
if(!outfile)
{
cerr<<"重置学生信息出错!"<<endl;
abort();
}
for(i=0;i<3;i++)
{
outfile.write((char*)&stu[i].stcstu,sizeof(stcStudent));
}
outfile.close();
}
void ResetCouInfo() //重置可选课程的函数
{
int count=0;
char ch='a';
Couse* c;
ofstream outfile("CouInfo.dat",ios::binary);
if(!outfile)
{
cerr<<"重置可选课程信息出错!"<<endl;
abort();
}
cout<<"a.添加课程 e.退出"<<endl;
cin>>ch;
while(ch!='e')
{
c=new Couse;
cout<<"请依次输入课程编号,课程名称,学分"<<endl;
cin>>(c->stccou).counum>>(c->stccou).couname>>(c->stccou).score;
outfile.write((char*)&c->stccou,sizeof(c->stccou));
delete c;
count+=1;
cout<<"a.添加课程 e.退出"<<endl;
cin>>ch;
}
Count=count;
outfile.close();
}
Student* ReadStuInfo() //读取学生信息
{
Student*c1,*c2;
ifstream infile("StuInfo.dat",ios::binary);
if(!infile)
{
cerr<<"读取学生信息出错!"<<endl;
abort();
}
for(int i=0;i<3;i++)
{
c1=new Student;
if(i==0)
c2=c1;
infile.read((char*)&c1->stcstu,sizeof(stcStudent));
c1=c1->Snext;
}
infile.close();
delete c1;
return c2;
}
Couse* ReadCouInfo()
{
int i;
Couse cou[3];
Couse* c;
ifstream infile("CouInfo.dat",ios::binary);
if(!infile)
{
cerr<<"读取可选课程信息出错!"<<endl;
abort();
}
for(i=0;i<Count;i++)
infile.read((char*)&cou[i].stccou,sizeof(cou[i].stccou));
infile.close();
for(i=0;i<Count-1;i++)
{
cou[i].Cnext=&cou[i+1];
cou[i+1].Cnext=NULL;
}
c=&cou[0];
return c;
}
void SelectCouse(Student* s)
{
int number;
char h='a';
cout<<endl<<"按a选课,按e退出选课:";
cin>>h;
while(h!='e')
{
cout<<endl<<"请输入课程编号:";
cin>>number;
s->stcstu.nelenum[s->stcstu.nele]=number;
s->stcstu.nele+=1;
cout<<endl<<"按a选课,按e退出选课:";
cin>>h;
}
}
void DeleteCouse(Student* s)
{
int number;
int i=0;
char h='a';
cout<<endl<<"按a删除课程,按e退出:";
cin>>h;
while(h!='e')
{
cout<<endl<<"请输入要删除的课程编号:";
cin>>number;
for(i=0;s->stcstu.nelenum[i]!=number;i++)
{
continue;
}
s->stcstu.nelenum[i]=0;
s->stcstu.nele-=1;
cout<<endl<<"按a删除课程,按e退出:";
cin>>h;
}
}