请大虾们进来看下

最近受好友之托帮他写了个学生选课系统作为课程设计(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;
 }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值