南京邮电大学C++实验(四)流运算符的重载及文件的使用(仅参考)
鲤鱼Louis 2024-07-08 13:35:01 阅读 51
一、实验目的和要求
(1)掌握在自定义的类中重载输入流运算符>>和输出流运算符<<,并输入/输出本类对象。
(2)掌握文件操作的步骤和方法,能利用程序建立数据文件、打开数据文件并进行相关操作。
二、实验环境(实验设备)
硬件: 微型计算机
软件: Windows 操作系统、Microsoft Visual Studio 2010
三、实验原理及内容
实验题目1: 文件(可事先用记事本建立)d:\course.txt 中存储有若干门课的课程名称和对
应选课人数,存储形式示意如下(真正的记录未必是3 条)。
高级语言程序设计 3018
面向对象程序设计及c++ 487
程序设计(实践) 2046
定义类Course,有2 个私有数据成员表达课程名称和对应选课人数,类中重载提取运算符“>>”和插入运算符“<<”,分别用于从文件中读取信息以及向屏幕输出信息。主函数中定义ifstream 对象以及Course 类的对象,通过“>>”依次读取文件记录,再通过“<<”输出至屏幕。最后输出共有多少条记录。
实验解答:
(1)参考实验指导教材中Course类的定义,给出在类外实现重载提取运算符“>>” 的函数定义:
<code>istream& operator >>(istream& in, Course& p)
{
in >> p.name >> p.number;
return in;
}
参考实验指导教材中Course类的定义,给出在类外实现重载插入运算符“<<” 的函数定义:
ostream& operator <<(ostream& out, const Course& p)
{
out <<setw(20)<< p.name<<setw(5) << p.number;
out << endl;
return out;
}
实验题目2:事先用Windows的记事本建立一个文本文件ff.txt。
① 编写一个函数void ReadFile(char* s)实现读取以s串为文件名的文本文件的内容在屏幕上显示。
② 编写一个函数void Change(char *s1,char *s2)将文本文件中的小写字母全部改写成大写字母生成一个新文件ff2.txt。
③ 主函数中调用ReadFile("ff.txt");显示ff.txt的内容,调用Change ("ff.txt" ,"ff2.txt");根据ff.txt文件作修改生成一个新的文件ff2.txt,最后再调用ReadFile("ff2.txt");显示新文件的内容。
实验解答:
void ReadFile(char *s) //请完成代码
void ReadFile(string s)
{
ifstream infile(s);
if (!infile)
{
cout << "Cannot be opened!" << endl;
return ;
}
char ch;
while (infile.get(ch))
cout << ch;
cout << endl;
infile.close();
}
void Change(char *s1,char *s2) //请完成代码
void Change(char* s1, char* s2)
{
ifstream inf(s1);
if(!inf)
{
cout << "Cannot be opened!" << endl;
return;
}
ofstream of(s2);
if(!of)
{
cout << "Cannot be opened!" << endl;
return;
}
char ch;
while (inf.get(ch))
{
if (ch >= 'a' && ch <= 'z')
{
ch -= 32;
}
of.put(ch);
}
inf.close();
of.close();
}
实验题目3(选做):定义学生类,该类包含学生的一些基本信息:学号、姓名、性别、成绩。定义流对象,实现用write函数将学生信息以二进制方式写到磁盘文件stu.dat中。再用read将磁盘中的学生信息读到内存显示在屏幕上。
实验解答:
(1)Student::Student(char *nu,char *na,char *se,int s) //构造函数
Student::Student(const char* nu, const char* na, const char* se, int s)
{
strcpy_s(num, nu);
strcpy_s(name, na);
strcpy_s(sex, se);
score = s;
}
ostream & operator<<(ostream &out,const Student &s) //重载输出运算符<<
ostream& operator<< (ostream& out, const Student& s) //重载"<<"运算符
{
out << setw(10) << s.num << setw(10) << s.name << setw(4) << s.sex << setw(5) << s.score << endl;
return out;
}
(2)void CreateBiFile(char *filename)
void CreateBiFile(char *filename)
{
ofstream out(filename);
Student stu[3]= ___Student stu[3] = { Student("B22041122","abc","男",99),
Student("B22041123","xyz","男",99),
Student("B22041124","lmn","男",99) };____//对象数组的初始化
out.write(_(char*)stu, sizeof(Student) * 3___); //两个实在参数自己填写
out.close( );
}
(3) void ReadBiFile(char *filename)
void ReadBiFile(char *filename)
{
Student stu[num];
int i=0;
ifstream in(filename);
while (!in.eof( )) //读出记录并显示
in.read((char*)&stu[i++], sizeof(Student));
for (int j = 0; j < i - 1; j++)
cout << stu[j];
in.close( );
}
(4)主函数代码:
int main()
{
CreateBiFile("d:\\stu.dat");
ReadBiFile("d:\\stu.dat");
}
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
(一)实验中遇到的主要问题及解决方法
1. 在题目(2)中如将主函数作如下修改,请补充完整程序:
int main( )
{ char s1[20],s2[20];
cin>>s1>>s2; //从键盘上输入要操作的文件名
Change(__s1,s2__);
//调用Change函数将s1串为文件名的内容修改后保存到以s2串为文件名的文本文件中
ReadFile(__s2___); //读取s2串为文件名的文本内容
return 0;
}
2.其它问题及解决方法
(1)问题:题目1中,在重载 <<运算符时,为了格式,用到了setw()函数,但一开始运行报错。
解决方法:在编译预处理时,应包含iomainp文件
(2)问题:题目2读取记录数时,j满足的条件
解决方法:根绝前面代码和i++后的值,设置全部读出记录时j所需的值
(二)实验心得
C++文件的学习与C类似,在编程时要紧密联系书本,根据书本的例题得出合适的代码,因此处难度较大,需要多加钻研。
(三)意见与建议(没有可省略)
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。