/*
* 程序头部注释开始
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:学生成绩处理
* 作 者:冯珍珍
* 完成日期:2011 年 6 月 11 日
* 版 本号:x1.0
* 对任务及求解方法的描述部分
* 输入描述:文件score.dat
* 问题描述:保存为二进制文件ASCII 文件score.dat 中保存的是100 名学生的姓名和C++课、高数和英语成绩。
(1)定义学生类,其中包含姓名、C++课、高数和英语成绩及总分、均分数据成员,成员函数根据需要确定。
(2)读入学生的成绩,并求出总分,用对象数组进行存储。
(3)将所有数据保存到一个二进制文件binary_score.dat 中,最后在文件中写入你自己的各科成绩(咱不谦虚,也求个好运,全100分)。
(4)为验证输出文件正确,再将binary_score.dat 中的记录逐一读出到学生对象中并输出查看。
* 程序输出:binary_score.dat
* 程序头部的注释结束
*/
#include <fstream>
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
//定义学生类
class Student
{
public:
Student(){};
Student(string nam, double c, double m, double e):name(nam),cpp(c),math(m),english(e){total=c+m+e;}
void set_value(string nam, double c, double m, double e);
string get_name(){return name;}
double get_cpp(){return cpp;}
double get_math(){return math;}
double get_english(){return english;}
double get_total(){return total;}
void set_cpp(double c){cpp=c;}
void set_math(double m){math=m;}
void set_english(double e){english=e;}
void set_total(double t){total=t;}
private:
string name;
double cpp;
double math;
double english;
double total;
};
void Student::set_value(string nam, double c, double m, double e)
{
name=nam;
cpp=c;
math=m;
english=e;
total=c+m+e;
}
int main( )
{
Student stud[102],t; //stud[100]为保存数据的对象数组
string sname;
double scpp, smath, senglish;
int i;
//将score.dat文件中的数据读入到对象数组中
ifstream infile("score.dat",ios::in | ios::binary); //以输入的方式打开文件并定义为二进制文件
if(!infile) //测试是否成功打开
{
cerr<<"open error!"<<endl;
abort();//退出程序,与exit函数的作用相同
}
for(i=0;i<101;i++)
{
infile>>sname>>scpp>>smath>>senglish;
stud[i].set_value(sname, scpp, smath, senglish);
}
infile.close();
cout<<"请到文件binary_score.dat中查看学生求总分后的成绩结果"<<endl<<endl;、
//以输出方式打开binary_score.dat文件,并定义为二进制类型的文件
ofstream outfile("binary_score.dat",ios::binary);
if(!outfile) //判断文件是否打开
{
cerr<<"open error!"<<endl;
exit(1);
}
stud[101].set_value("冯珍珍",100,100,100);//调用函数输入我的信息
for(i=0;i<102;i++)
{
outfile.write((char*)&stud[i],sizeof(stud[i])); //用write函数以二进制形式将信息读入文件
}
outfile.close();
//将binary_score.dat文件中的数据读入到对象数组中
ifstream onfile("binary_score.dat", ios::in|ios::binary); //以输入的方式打开文件
if(!onfile) //测试是否成功打开
{
cerr<<"open error!"<<endl;
abort(); //退出程序,与exit函数的作用相同
}
cout << setiosflags(ios::left) << setw(12) << "姓名" << setw(8) << "C++" << setw(8) << "高数" << setw(8) << "英语" << setw(8) <<"总分" << setw(8) << endl;
for(int i=0;i<102;i++)
{
onfile.read((char*)&stud[i],sizeof(stud[i])); //用read函数以二进制形式将信息从文件中读出来
cout<<setiosflags(ios::left)<<setw(12)<<stud[i].get_name()<<setw(8)<<stud[i].get_cpp()<<setw(8)<<stud[i].get_math()<<setw(8)<<stud[i].get_english()<<setw(8)<<stud[i].get_total()<<setw(8)<<endl; //在屏幕上显示分数信息
}
onfile.close();
system("pause");
return 0;
}