实 验 报 告 | |||
实验名称 | 流运算符的重载及文件的使用 | ||
实验类型 | 验证 | 实验学时 | 2 |
(1)掌握在自定义的类中重载输入流运算符>>和输出流运算符<<,并输入/输出本类对象。 (2)掌握文件操作的步骤和方法,能利用程序建立数据文件、打开数据文件并进行相关操作。 | |||
二、实验环境(实验设备) 硬件: 微型计算机 软件: Windows 操作系统、Microsoft Visual Studio 2010 | |||
三、实验原理及内容(中文五号宋体,英文五号Consolas字体,单倍行距) 实验题目1: 文件(可事先用记事本建立)d:\course.txt 中存储有若干门课的课程名称和对 应选课人数,存储形式示意如下(真正的记录未必是3 条)。 高级语言程序设计 3018 面向对象程序设计及c++ 487 程序设计(实践) 2046 定义类Course,有2 个私有数据成员表达课程名称和对应选课人数,类中重载提取运算符“>>”和插入运算符“<<”,分别用于从文件中读取信息以及向屏幕输出信息。主函数中定义ifstream 对象以及Course 类的对象,通过“>>”依次读取文件记录,再通过“<<”输出至屏幕。最后输出共有多少条记录。 实验解答:
istream & operator >> (istream &in,Course &dt){ in>>dt.name>>dt.number; return in; }
ostream & operator << (ostream &out,const Course &dt){ out<<dt.name<<dt.number<<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){ string str; ifstream in(s); if(!in){ cout<<"s cannot open!"<<endl; return ; } getline(in,str); cout<<str<<"\n"; in.close(); } } void Change(char *s1,char *s2) //请完成代码 { void Change(string s1,string s2){ ifstream in(s1); if(!in){ cout<<"ff cannot open!"<<endl; return ; } ofstream out (s2); if(!out){ cout<<"ff2 cannot open!"<<endl; return ; } char ch; if (in.get(ch)) { if(ch>='a'&&ch<='z') out.put(ch-32); } else { out.put(ch); } in.close(); out.close(); return ; } } 实验题目3(选做):定义学生类,该类包含学生的一些基本信息:学号、姓名、性别、成绩。定义流对象,实现用write函数将学生信息以二进制方式写到磁盘文件stu.dat中。再用read将磁盘中的学生信息读到内存显示在屏幕上。 实验解答: (1)Student::Student(char *nu,char *na,char *se,int s) //构造函数 { strcpy(num,nu); strcpy(name,na); strcpy(sex,se); score=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) { ofstream out(filename); Student stu[3]= _{Student("B19041028","陈秋驰","男",94), Student("B190111012","宋文姝","女",98),Student("B19020908","米其林","女",87)};__//对象数组的初始化 out.write(___(char *)stu,sizeof(Student)*3__); //两个实在参数自己填写 out.close( ); } (3) 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() { CreatBiFile("d:\\stu.dat"); ReadBiFile("d:\\stu.dat"); return 0; } | |||
(中文五号宋体,英文五号Times new roman字体,单倍行距) (一)实验中遇到的主要问题及解决方法 1. 在题目(1)中,要求重载“>>”和“<<”以方便地实现输入和输出,结合第三次实验中这两个运算符的重载,理解为什么“>>”和“<<”既可以用于键盘输入/屏幕输出和文件读写? 重载流操作符时,如果第一个参数的类型为ostream或者istream,那么这个重载函数既可以用于标准输入输出流也可以用于文件流ostream和istream是标准输入输出流,文件流和字符流的基类 2. 在题目(2)中如将主函数作如下修改,请补充完整程序: int main( ) { char s1[20],s2[20]; cin>>s1>>s2; //从键盘上输入要操作的文件名 Change(_________s1,s2______________); //调用Change函数将s1串为文件名的内容修改后保存到以s2串为文件名的文本文件中 ReadFile(__________s2_____________); //读取s2串为文件名的文本内容 return 0; } 3.其它问题及解决方法 (二)实验心得 建议多敲代码 (三)意见与建议(没有可省略) 多敲代码 |
10-29
1万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
12-12
1369
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
10-29
1万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)