文件(可事先用记事本建立)d:\course.txt 中存储有若干门课的课程名称和对应选课人数,存储形式示意如下(真正的记录未必是3 条)。
| 高级语言程序设计 | 3018 |
|---|---|
| 面向对象程序设计及 | c++ 487 |
| 程序设计(实践) | 2046 |
定义类Course,有2 个私有数据成员表达课程名称和对应选课人数,类中重载提取运算符“>>”和插入运算符“<<”,分别用于从文件中读取信息以及向屏幕输出信息。主函数中定义ifstream 对象以及Course 类的对象,通过“>>”依次读取文件记录,再通过“<<”输出至屏幕。最后输出共有多少条记录。
(1) 参考实验指导教材中Course类的定义,给出在类外实现重载提取运算符“>>” 的函数定义:
istream & operator>>(istream & in,Course & p)
{
in>>p.name;
in>>p.number;
return in;
}
(2) 参考实验指导教材中Course类的定义,给出在类外实现重载插入运算符“<<” 的函数定义:
ostream & operator<<(ostream & out,const Course & p)
{
out<<p.name<<" "<<p.number<<endl;
return out;
}
事先用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) //请完成代码
{
ifstream inf(s);
if (!inf)
{
cout << "cannot open " << s << endl;
return;
}
char ch;
while (inf.get(ch))
{
cout << ch;
}
inf.close();
}
void Change(char *s1,char *s2) //请完成代码
{
ifstream inf(s1);
if (!inf)
{
cout << "cannot open " << s1 << endl;
return;
}
ofstream ofile(s2);
if (!ofile)
{
cout << "cannot open " << s2 << endl;
return;
}
char ch;
while (inf.get(ch))
{
if (ch >= 'a' && ch <= 'z')
ch -= 32;
ofile.put(ch);
}
inf.close();
ofile.close();
cout << endl;
return;
}
定义学生类,该类包含学生的一些基本信息:学号、姓名、性别、成绩。定义流对象,实现用write函数将学生信息以二进制方式写到磁盘文件stu.dat中。再用read将磁盘中的学生信息读到内存显示在屏幕上。
在题目(1)中,要求重载“>>”和“<<”以方便地实现输入和输出,结合第三次实验中这两个运算符的重载,理解为什么“>>”和“<<”既可以用于键盘输入/屏幕输出和文件读写?
因为 ostream 和 istream 是输入输出流、文件流、字符串流的基类,实现多态性。
在题目(2)中如将主函数作如下修改,请补充完整程序:
int main( )
{
char s1[20],s2[20];
cin>>s1>>s2; //从键盘上输入要操作的文件名
Change(__s1,s2_);
//调用Change函数将s1串为文件名的内容修改后保存到以s2串为文件名的文本文件中
ReadFile(_s2__); //读取s2串为文件名的文本内容
return 0;
}
无
文件的处理还不太熟悉,要多加练习。
实现了文件读写操作,简单地文件处理。