一个关于C++文件读取的问题?
程序存的时候没问题
但写的时候出现了问题
这是什么原因?
// Student.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include<fstream>
#include <iomanip>
#include <functional>
using namespace std;
class Student
{
int num;
string name;
string sex;
int score1;
int score2;
int score3;
int aver;
int sum;
public:
Student(){}
Student(int Nnum,string Nname,string Nsex,int score1,int score2,int score3);
void setNum(int Nnum){num=Nnum;}
int getNum(){return num;}
void setName(string Nname){name=Nname;}
string getName(){return name;}
void setSex(string Nsex){sex=Nsex;}
string getSex(){return sex;}
void setScore1(int Nscore1){score1=Nscore1;}
int getScore1(){return score1;}
void setScore2(int Nscore2){score2=Nscore2;}
int getScore2(){return score2;}
void setScore3(int Nscore3){score3=Nscore3;}
int getScore3(){return score3;}
int getAver(){return (score1+score2+score3)/3;}
int getSum(){return score1+score2+score3;}
void disp();
};
bool less_sum( Student &m1, Student &m2)
{
return m1.getSum() > m2.getSum();
}
class studentBox
{
vector <Student> stu;
public:
void addStudent();
void displayAll();
void menu();
void inout();
void in();
void out();
};
void Student::disp()
{
cout <<setw(6) <<getNum() <<setw(8) <<getName() <<setw(6) <<getSex()
<<setw(6) <<getScore1() <<setw(6) <<getScore2()
<<setw(6) <<getScore3() <<setw(6) <<getSum() <<setw(6) <<getAver() <<endl;
}
Student::Student(int Nnum,string Nname,string Nsex,int Nscore1,int Nscore2,int Nscore3)
{
setNum(Nnum);
setName(Nname);
setSex(Nsex);
setScore1(Nscore1);
setScore2(Nscore2);
setScore3(Nscore3);
sum = getSum();
}
void studentBox::addStudent()
{
vector <Student>::iterator iter;
char ch;
int Nnum,Nscore1,Nscore2,Nscore3;
string Nname,Nsex;
int flag(1);
do{
if(stu.size()==0)
{
cout <<"请输入新学号: ";
cin>>Nnum;
}
else
{
do{
flag=1;
cout <<"请输入学号: ";
cin>>Nnum;
for(iter=stu.begin();iter!=stu.end();iter++)
if(iter->getNum()==Nnum)
{
cout <<"该学号已存在..." <<endl;
flag=0;
}
}while(flag==0);
}
cout <<"请输入姓名: ";
cin>>Nname;
cout <<"请输入性别: ";
cin>>Nsex;
cout <<"请输入数学成绩: ";
cin>>Nscore1;
cout <<"请输入语文成绩: ";
cin>>Nscore2;
cout <<"请输入英语成绩: ";
cin>>Nscore3;
Student s(Nnum,Nname,Nsex,Nscore1,Nscore2,Nscore3);
stu.push_back(s);
cout <<"\n 继续输入吗?(Y/N): ";
cin>>ch;
}while(ch=='Y'||ch=='y');
}
void studentBox::displayAll()
{
vector <Student>::iterator iter;
if(stu.size()==0)
cout <<"没有学生资料......" <<endl;
else
{
std::sort(stu.begin(), stu.end(),less_sum);
cout <<"学号 " <<"姓名 " <<"性别 " <<"数学成绩 " <<"语文成绩 " <<"英语成绩 " <<"总分 " <<"平均分 " <<endl;
for(iter=stu.begin();iter!=stu.end();iter++)
iter->disp();
}
}
void studentBox::inout()//保存学生资料函数的实现
{
char ch;
do{
cout<<" \t\t#############################################"<<endl;
cout<<" \t\t#\t\t选择1:储存! #"<<endl;
cout<<" \t\t#-------------------------------------------#"<<endl;
cout<<" \t\t#\t\t选择2:读取! #"<<endl;
cout<<" \t\t#-------------------------------------------#"<<endl;
cout<<" \t\t#\t\t选择0:返回上一级! #"<<endl;
cout<<" \t\t#-------------------------------------------#"<<endl;
cout<<" \t\t#\t\t请选择你要进行的操作! #"<<endl;
cout<<" \t\t#############################################"<<endl;
cout<<" \t\t:";
cin>>ch;
switch(ch)
{
case'1':out(); break;
case'2':in(); break;
case'0':cout<<"\t\t\t\t 上一级!"<<endl;break;
default:cout<<" \t\t输入错误,重新输入:"<<endl;break;
}
}while(ch!='0');
}
void studentBox::in()
{
Student s;
fstream text1("student.txt",fstream::in);
if(!text1)
{
cerr<<"文件打开失败"<<endl;
}
else
{
while(1)
{
text1.read((char*) &s,sizeof(s));
if(!text1) break;
stu.push_back(s);
}
}
text1.close();
}
void studentBox::out()
{
fstream text("student.txt",fstream::out);//建立一个名为student.txt的文件
if(!text)
{
cerr<<"文件打开失败"<<endl;
}
//保存结果
else
{
text<<" 学号 "<<"姓名 "<<"性别 "<<"数学成绩 "<<"语文成绩 "<<"英语成绩 "<<"总分 "<<"平均分 "<<endl;
for(vector<Student>::iterator iter=stu.begin();iter!=stu.end();++iter)
text<<" "<<setw(4)<<iter->getNum() <<setw(8)<<iter->getName() <<setw(8)<<iter->getSex()
<<setw(12)<<iter->getScore1() <<setw(10)<<iter->getScore2()
<<setw(10)<<iter->getScore3() <<setw(6)<<iter->getSum()<<setw(10)<<iter->getAver()<<endl;
cout<<"\n\t\t正在保存学生的资料!.......\n";
cout<<"\n\t\tOK!保存完毕!\n";
text.close();
menu();
}
}
void studentBox::menu()
{
char ch;
do{
cout <<"选择1:学生数据的输入!" <<endl;
cout <<"选择2:排序并显示!" <<endl;
cout <<"选择3:学生数据的读取与储存! #"<<endl;
cout <<"选择0:退出!" <<endl;
cout <<"请选择你要进行的操作!" <<endl;
cin>>ch;
switch(ch)
{
case'1':addStudent();break;
case'2':displayAll();break;
case'3':inout();break;
case'0':cout <<"\t\t\tGoodbye!" <<endl;break;
default:cout <<"输入错误,重新输入:";break;
}
}while(ch!='0');
}
int main()
{
studentBox box;
box.menu();
return 0;
}
最好能按格式读入