南京邮电大学C++实验报告4

实 验 报 告

实验名称

流运算符的重载及文件的使用

实验类型

验证

实验学时

2

  • 实验目的和要求

(1)掌握在自定义的类中重载输入流运算符>>和输出流运算符<<,并输入/输出本类对象。

(2)掌握文件操作的步骤和方法,能利用程序建立数据文件、打开数据文件并进行相关操作。

二、实验环境(实验设备)

硬件:  微型计算机

软件:  Windows 操作系统、Microsoft Visual Studio 2010

三、实验原理及内容中文五号宋体,英文五号Consolas字体,单倍行距)

实验题目1: 文件(可事先用记事本建立)d:\course.txt 中存储有若干门课的课程名称和对

应选课人数,存储形式示意如下(真正的记录未必是3 条)。

高级语言程序设计 3018

面向对象程序设计及c++ 487

程序设计(实践) 2046

定义类Course,有2 个私有数据成员表达课程名称和对应选课人数,类中重载提取运算符“>>”和插入运算符“<<”,分别用于从文件中读取信息以及向屏幕输出信息。主函数中定义ifstream 对象以及Course 类的对象,通过“>>”依次读取文件记录,再通过“<<”输出至屏幕。最后输出共有多少条记录。

实验解答:

  1. 参考实验指导教材中Course类的定义,给出在类外实现重载提取运算符“>>” 的函数定义:

istream & operator >> (istream &in,Course &dt){

in>>dt.name>>dt.number;

return in;

}

  1. 参考实验指导教材中Course类的定义,给出在类外实现重载插入运算符“<<” 的函数定义:

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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值