一个关于C++文件读取的问题?

lenshen_1 2009-06-19 03:19:56
程序存的时候没问题
但写的时候出现了问题
这是什么原因?
// 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;
}


最好能按格式读入
...全文
80 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lc5697 2009-06-20
  • 打赏
  • 举报
回复
26°C东皇大叔 2009-06-20
  • 打赏
  • 举报
回复
晕的!
icelemon1314 2009-06-19
  • 打赏
  • 举报
回复
要是c++的话还好 c的话就不行了
帮顶.....
lenshen_1 2009-06-19
  • 打赏
  • 举报
回复
应该改才能做到统一?
保存下来的又不是乱码。
reenwoo 2009-06-19
  • 打赏
  • 举报
回复
看的有点花
w0911h 2009-06-19
  • 打赏
  • 举报
回复
1楼正解,读写不一致肯定不行,要么写结构体读结构体,要么就都一个一个格式化读,混着用肯定不行
woods2001 2009-06-19
  • 打赏
  • 举报
回复
代码真长
顶一下~
Quers 2009-06-19
  • 打赏
  • 举报
回复
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;


你这么复杂的写入txt文件中这么多东西,然后只用一句
text1.read((char*) &s,sizeof(s));
就把文件内容读到s这个类中,s是接收到的数据就不对了。。。
这样,s在pubsh_back()时就发生了错误。


回帖是一种美德!每天回帖即可获得 10 分可用分!
Sou2012 2009-06-19
  • 打赏
  • 举报
回复
帮顶

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧