实验4 流运算符的重载及文件的使用.docx
《实验4 流运算符的重载及文件的使用.docx》由会员分享,可在线阅读,更多相关《实验4 流运算符的重载及文件的使用.docx(12页珍藏版)》请在冰豆网上搜索。
实验4流运算符的重载及文件的使用
西华大学
实验报告
(2010/2011学年第二学期)
课程名称
面向对象程序设计
实验名称
流运算符的重载及文件的使用
实验时间
年
月
日
指导单位
指导教师
学生姓名
班级学号
学院(系)
专业
实验报告
实验名称
流运算符的重载及文件的使用
实验类型
验证
实验学时
2×2
一、实验目的和要求
(1)掌握在自定义的类中重载输入流运算符>>和输出流运算符<<,并输入/输出本类对象。
(2)掌握文件操作的步骤和方法,能利用程序建立数据文件、打开数据文件并进行相关操作。
二、实验环境(实验设备)
硬件:
微型计算机
软件:
MicrosoftVisualC++6.0
三、实验原理及内容
实验题目
(1):
在上一次实验的基础上,在复数类中增加输入流运算符>>和输出流运算符<<的重载,主函数通过“cin>>对象名”输入对象的值,通过“cout<<对象名”输出对象的值,输出复数值时将原来主函数中“对象名.print()”改成“cout<<对象名”形式。
实验解答:
1写出在复数类中增加的输入流运算符>>和输出流运算符<<的重载函数完整代码:
ostream&operator<<(ostream&out,constComplex&a)
{
out<if(a.imag!
=0)
{
if(a.imag>0)
out<<"+";
out<}
out<returnout;
}
istream&operator>>(istream&in,constComplex&a)
{
in>>a.real;
if(a.imag!
=0)
{
if(a.imag>0)
in>>"+";
in>>a.imag>>"i";
}
returnin;
}
②写出主函数中调用流运算符函数的主要代码(对算术运算符重载函数的调用可以忽略)
voidmain()
{
Complexa1,a2;
cout<<"a1=";
cin>>a1;
cout<<"a2=";
cin>>a2;
cout<<"originala1is:
"<cout<<"originala2is:
"<}
实验报告
③在上一步完成的基础上,将复数类改成一个类模板,只设一个模板参数,即实部和虚部用同一种类型,修改相应的代码,完成输入、输出功能。
只保留+、-、>>、<<运算符重载的定义及调用,写出完整的程序代码。
#include
usingnamespacestd;
template
classComplex
{
private:
Treal;
Timag;
public:
Complex(Tr=0,Ti=0)
{
real=r;
imag=i;
}
friendComplexoperator+(constComplex&a,constComplex&b);
friendComplexoperator-(constComplex&a,constComplex&b);
friendostream&operator<<(ostream&out,constComplex&a);
friendistream&operator>>(istream&in,constComplex&a);
Complexoperator*(constComplex&a);
Complexoperator/(constComplex&a);
};
template
ostream&operator<<(ostream&out,constComplex&a)
{
out<if(a.imag!
=0)
{
if(a.imag>0)
out<<"+";
out<}
out<returnout;
}
template
istream&operator>>(istream&in,constComplex&a)
{
in>>a.real;
if(a.imag!
=0)
{
if(a.imag>0)
in>>"+";
in>>a.imag>>"i";
}
returnin;
}
template
Complexoperator+(constComplex&a,constComplex&b)
{
Complextemp;
temp.real=a.real+b.real;
temp.imag=a.imag+b.imag;
returntemp;
}
template
Complexoperator-(constComplex&a,constComplex&b)
{
Complextemp;
temp.real=a.real-b.real;
temp.imag=a.imag-b.imag;
returntemp;
}
template
ComplexComplex:
:
operator*(constComplex&a)
{
Complextemp;
temp.real=real*a.real;
temp.imag=imag*a.imag;
returntemp;
}
template
ComplexComplex:
:
operator/(constComplex&a)
{
Complextemp;
temp.real=real/a.real;
temp.imag=imag/a.imag;
returntemp;
}
voidmain()
{
Complexa1,a2,a3,a4,a5,a6;
cout<<"a1=";
cin>>a1;
cout<<"a2=";
cin>>a2;
cout<<"originala1is:
"<cout<<"originala2is:
"<a3=a1+a2;
cout<<"a3=a1+a2="<a4=a1-a2;
cout<<"a4=a1-a2="<a5=a1*a2;
cout<<"a5=a1*a2="<a6=a1/a2;
cout<<"a6=a1/a2="<}
实验报告
实验题目
(2):
事先用Windows的记事本建立一个文本文件ff.txt。
①编写一个函数voidReadFile(char*s)实现读取以s串为文件名的文本文件的内容在屏幕上显示。
②编写一个函数voidChange(char*s1,char*s2)将文本文件中的小写字母全部改写成大写字母生成一个新文件ff2.txt。
③主函数中调用ReadFile("ff.txt");显示ff.txt的内容,调用Change("ff.txt","ff2.txt");根据ff.txt文件作修改生成一个新的文件ff2.txt,最后再调用ReadFile("ff2.txt");显示新文件的内容。
实验解答:
根据实验提示完成实验,完整的程序代码如下:
#include
#include
voidReadFile(char*s);
voidChange(char*s1,char*s2);
voidmain()
{
ReadFile("ff.txt");
Change("ff.txt","ff2.txt");
ReadFile("ff.txt");
}
voidReadFile(char*s)
{
charch[100];
ifstreaminf(s);
if(!
inf)
{
cout<<"Cannotopenthefile!
\n";
return;
}
inf.get(ch);
cout<inf.close();
}
voidChange(char*s1,char*s2)
{
ifstreamifile("ff.txt");
if(!
ifile)
{
cout<<"ff.txtcannotbeopenned!
"<return;
}
ofstreamofile("d:
\\temp\\ff2.txt");
if(!
ofile)
{
cout<<"ff2.txtcannotbeopenned!
"<return;
}
charch;
while(ifile.get(ch))
{
ch=ch-32;
ofile.put(ch);
}
ifile.close();
ofile.close();
}
实验报告
实验题目(3):
定义学生类,该类包含学生的一些基本信息:
学号、姓名、性别、成绩。
定义流对象,实现用write函数将学生信息以二进制方式写到磁盘文件stu.dat中。
再用read将磁盘中的学生信息读到内存显示在屏幕上,对读出的记录按总分进行排序后,再将学生信息以二进制方式写到磁盘文件stuSort.dat中。
程序中定义CreateBiFile()函数建立二进制文件,定义ReadBiFile()函数读出二进制文件内容并显示,定义Sort()函数按总分进行排序。
实验解答:
根据实验提示,完整的程序代码如下:
#include
#include
#include
classStudent
{
charnum[10];
charname[10];
charsex[3];
intscore;
public:
Student(char*nu="",char*na="",char*se="",ints=0);
friendostream&operator<<(ostream&out,constStudent&s);
};
Student:
:
Student(char*nu="",char*na="",char*se="",ints)
{
strcpy(num,&nu);
strcpy(name,&na);
strcpy(sex,&se);
score=s;
}
ostream&operator<<(ostream&out,constStudent&s)
{
out<<"\nNumber:
"<"<"<"<returnout;
}
voidCreateBiFile(char*filename)
{
ofstreamout(filename);
Studentstu[3]="'0001','王平','女',97";
out.write(stu,20);
out.close;
}
voidReadBiFile(char*filename)
{
Studentstu[3];
inti=0;
ifstreamin(filename);
while(!
in.eof())
out<in.close;
}
voidmain()
{
CreateBiFile("stu.dat");
ReadBiFile("stu.dat");
}
实验报告
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
1.你认为在自定义类中重载输入/输出流运算符有什么意义?
方便用户采取“cin>>变量名”的输入方式和“cout<<表达式”的输出方式
实现用户自定义类型数据的输入和输出。
2.在文件操作中read和write这一对函数适合于读写哪一种类型的数据?
read()与write()函数一般成对使用,既可以用于对文本文件的读写,也可以用于
对二进制文件的读写,每次读写一个数据块,一般主要用于对二进制文件的读写。
3.题目(3)的学生信息可以以文本文件的形式存储吗?
可以。
4.其它问题及解决办法:
1,自定义类中重载输入/输出流运算符后的变量是对象;
2,打开文件后要判断文件是否正确打开,并且打开文件后一定要主要关闭文件。
5.心得体会:
通过本次试验我熟练的掌握了输入\输出运算符重载的运用,并深刻体会到了它
的方便性;采用文件的方式操作文件能够很好的保持,输出信息。
五、指导教师评语
成绩
批阅人
日期