南京邮电大学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类似,在编程时要紧密联系书本,根据书本的例题得出合适的代码,因此处难度较大,需要多加钻研。

(三)意见与建议(没有可省略)



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。