您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 实验7-输入输出流库
实验内容程序Ex_File:用文件来实现一个学生记录的添加、查找等操作。提示:学生记录用类CstudenRec表示,它的数据成员有:姓名、学号、3门课的成绩以及总平均分,成员函数记录显示Print、记录键盘输入Input和数据校验Validate以及“”””运算符重载等。文件操作用CStuFile类定义,成员函数有数据的添加Add、查找Seek、显示List等。实验准备和说明(1)在学习完第2章内容之后进行本次实验。(2)编写本次上机所需要的程序。实验步骤1.创建工作文件夹打开计算机,在“D:\VisualC++程序、LiMing”文件夹中创建一个新的子文件夹“实验7”。2.创建控制台应用程序项目Ex_File创建控制台应用程序项目Ex_File的具体步骤如下。(1)启动VisualC++6.0。(2)选择“文件”→“新建”菜单命令,显示出“新建”对话框。从列表框中选中Win32ConsoleApplication项。(3)在“工程”编辑框中输入控制台应用程序项目名称Ex_File,并将项目文件夹定位到“D:\VisualC++程序\LiMing\实验7”。(4)单击“确定”按钮,显示Win32应用程序向导对话框。选中Anemptyproject项。单击“完成”按钮,系统将显示向导创建的信息,单击“确定”按钮将自动创建此应用程序。3.添加Ex_File.h文件添加Ex_File.h文件的具体步骤如下。(1)选择“文件”→“新建”菜单命令,将“新建”对话框切换到“文件”标签页面,选中“C/C++HeaderFile”文件类型,在文件编辑框中输入Ex_File.h,单击“确定”按钮。(2)在Ex_File.h中添加CstudentRec类代码:#includeiostream.h#includeiomanip.h#includefstream.h#includestring.hclassCstudentRec{public:CstudentRec(char*name,char*id,floatscore[]);CstudentRec(){chFlag=`N`;};∥默认构造函数~CStudentRec(){};//默认析构函数voidInput(void);//键盘输入,返回记录floatValidate(void);//成绩数据的输入验证,返回正确值voidPrint(boolisTitle=false);//记录显示friendostream&operator(ostream&os,CStudentRec&stu);friendistream&operator(istream&is,CStudentRec&stu);charchFlag;//标志,‘A’表示正常,‘N’表示空charstrName[20];//姓名charstrID[10];//学号floatfScore[3];//3门成绩floatfAve;//总平均分};//CStudent类的实现CStudentRec::CStudentRec(char*name,char*id,floatscore[]){strncpy(strName,name,20);strncpy(strID,id,10);fAve=0;for(onti=0;i3;i++){fScore[i]=score[i];fAve+=fScore[i];}fAve=float(fAve/3.0);chFlag='A';}voidCStudentRec::Input(void){cout姓名;cinstrName;cout学号;cinstrID;floatfSum=0;for9inti=0;i3;i++){cout成绩i+1:;fScore[i]+Validate();fSum+=fScore[i];}fAve=(float)(fSum/3.0);chFlag='A';}floatCStudentRec::Validate(void){ints;lcharbuf[80];floatres;for(;;){cinres;s=cin.rdstate();while(s){cin.clear();cin.getline(buf,80);cout非法输入,重新输入:;cinres;s=cin.rdstate();}if((res=100.0)&&(res=0.0))break;elsecout输入的成绩超过范围!请重新输入:;}returnres;}voidCStudentRec::Print(boolisTitle){cout.setf(ios::left);if(isTitle)coutsetw(20)姓名setw(10)学号\t成绩1\t成绩2\t成绩3\t平均分endl;coutsetw(20)strNamesetw(10)strID;for(inti=0;i3;i++)cout\tfScore[i];cout\tfAveendl;}ostream&operator(ostream&os,CStudentRec&stu){os.write(&stu.chFlag,sizeof(char));os.write(stu.strName,sizeof(stu.strName));os.write(stu.strID,sizeof(stu.strID));os.write((char*)stu.fScore,sizeof(float)*3;os.write((char*)&stu.fAve,sizeof(float));returnos;}istrean&operator(istream&is,CStudentRec&stu){charname[20],id[10];is.read(&stu.chFlag,sizeof(char));is.read(name,sizeof(name));is,read(id,sizeof(id));is.read((char*)stu.fScore,sizeof(float)*3);is.read((char*)&stu.fAve,sizeof(float));strncpy(stu.strName,name,sizeof(name));strncpy(stu.strID,id,sizeof(name));returnis;}4.添加Ex_File.cpp文件,测试CStudentRec类添加Ex_File.cpp文件,测试CStudentRec类的具体步骤如下。(1)选择“文件”→“新建”菜单命令,将“新建”对话框切换到“文件”标签页面,选中“C++SourceFile”文件类型,在文件编辑框中输入Ex_File.cpp,单击“确定”按钮。(2)在Ex_File.cpp中添加CStudentRec类的测试代码:#includeiostream.h#include”Ex_File.h”voidmain(){floatfScore[]={80,90,92};CStudentRecrec1(“Ding”,”21050101”,fScore);Rec1.Print(true);CStudentRecrec2;Rec2.Input();Rec2.Print(true);}(3)编译运行并测试,CStudentRec类的测试结果如图T7.1所示。试一试若将输入的学生记录保存在文件中,并从文件中读取记录,则这样的功能应如何实现?5.添加CStuFile类代码添加CStuFile类代码的具体步骤如下。(1)将工作区窗口切换到FileView页面,展示所有结点,双击Ex_File.h结点。(2)在Ex_File.h文件后面添加以下CStuFile类代码:classCStuFile{public:CStuFile(char*filename);~CStuFile();voidAdd(CStudentRec&stu);intSeek(char*id,CStudentRec&stu);intList(intnNum=-1);private:char*strFileName;};CStuFile:::CStuFile(char*filename){strFileName=newchar[strlen(Filename)+1];strcpy(strFileName,filename);}CStuFile::~CStuFile(){if(strFileName)delete[]strFileName;}voidCStuFile::Add(CStudentRecstu){Fstreamfile(strFileName,ios::outlios::applios::binary);filestu;file.close();}intCStuFile::Seek(char*id,CStudentRec&stu){intnRec=-1;Fstreamfile(strFileName,ios::inlios::nocreate);if(!file){cout”文件”strFileName”不能打开!\n”;returnnRec;}inti=0;while(!file.eof()){filestu;if((strcmp(id,stu.strID)==0)&&(stu.chFlag!=’N’)){nRec=I;break;i++;}file.close();returnnRec;}//列表显示nNum个记录,-1时全部显示,并返回文件中的记录数intCstuFile:List(intnNum){Fstreamfile(strFileName,ios::inlios::nocreate);//打开文件用于只读if(!file){cout”文件”strFileName“不能打开!\n”;return0;}intnRec=0;if((nNum==-1)!!(nNum0)){cout_setf(ios::left);coutsetw(6)”记录”setw(20)”姓名”setw(10)”学号””\t成绩1\t成绩2\t成绩3\t平均分”endl;}while(!file.eof()){CstudentRecdata;filedata;if(data.chFlag==”A”){nRec++;if((nNum==-1)||(nRec=nNum)){cout.setf(ios::left);coutsetw(6)nRec;data.Print();}}}file.close();returnnRec;}6.添加CstuFile类的测试代码添加CstuFile类的测试代码的具体步骤如下。(1)在工作区窗口的FileView页面中,双击Ex_File.cpp结点。(2)修改Ex_File.cpp文件的代码:#includeiostream.h#include“Ex_File.h”CstuFiletheStu(“student.txt”);//定义一个全局对象voidAddTo(intnNum)//输入多个记录{CstudentRecstu;for(inti=0;inNum;i++){cout”请输入第”i+1”记录:”endl;stu.Input();theStu.Add(stu);}}voidmain(){AddTo(3);theStu.List();Cstudentone;if(heStu.Seek(“21050102”,one)=0)onePrint(true);elsecout”没有找到!\n”;theStu.List();}(3)编译运行并测试,按运行的提示内容输入下列3哥记录数据:MaWenTao21050101809085LiMing21
本文标题:实验7-输入输出流库
链接地址:https://www.777doc.com/doc-3570414 .html