ImageVerifierCode 换一换
格式:PPT , 页数:64 ,大小:299.01KB ,
文档编号:3407209      下载积分:28 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-3407209.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(三亚风情)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(程序设计实习第十八讲输入输出流和文件操作.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

程序设计实习第十八讲输入输出流和文件操作.ppt

1、程序设计实习课程 (C+Programming Practice)程序设计实习第十八讲 输入输出流和文件操作主讲教师:田永鸿http:/ 虚函数和多态o 纯虚函数和抽象类o 多态的实现:虚函数表o 虚函数的访问权限o 构造函数和析构函数中调用虚函数o 虚析构函数北京大学程序设计实习课程3课堂问题(1)1.判断对错并说明理由a)抽象基类中的所有virtual函数都必须声明为纯virtual函数;b)声明某个类为virtual,该类就成为抽象类。c)如果基类声明了一个纯virtual函数,派生类只有实现该函数才能成为具体类。2.下面的定义是否正确,该如何改正?class base string n

2、ame()return basename;virtual void print(ostream&os)osbasename;private:basename;class derived void print()print(ostream&os);os“”mem;private:int meme;class derived:public base void print()base:print(os);os“”mem;private:int meme;同时,基类及派生类也应该定义构造函数和析构函数。base:base(string name):basename(name);base:base();

3、derived:derived(string name,int val):base(name),mem(val);derived:derived();北京大学程序设计实习课程4课堂问题(2)3.下列关于重载函数和虚函数的辨析描述中,理解不正确的是:a)重载函数处理的是同一类层次上的同名函数问题,而虚函数处理的是不同派生层次上的同名函数问题。b)重载函数要求函数有相同的函数名称,不管返回值类型是否相同,但参数序列必须不同,而虚函数则要求函数名、参数序列和返回值类型完全相同。c)重载函数和虚函数都必须是类成员函数,但重载函数一般功能类似,而虚函数一般功能有所不同,甚至基类虚函数的函数体可以为空,具

4、体功能在派生类中添加。d)重载函数在编译时,根据传递参数序列的不同,确定具体调用表现多态性,而虚函数在运行时,根据基类指针或引用所指向对象的不同,确定具体调用表现出多态性。北京大学程序设计实习课程5课堂问题(3)4.请写出运行时输出的结果 class A public:A()virtual void func()cout A:func endl;A()virtual void fund()cout A:fund endl;class B:public A public:B()func();void fun()func();B()fund();class C:public B public:C(

5、)void func()cout C:func endl;C()fund();void fund()cout C:fund endl;main()C c;A:funcC:fundA:fund北京大学程序设计实习课程6内容提要o 输入输出流o 文件操作o 作业北京大学程序设计实习课程7输入输出流o 流的概念模型o C+中与流操作相关的类及其继承关系o 输入输出流对象:cin,cout,cerr,clogo 输出流o 输入流o 无格式输入输出o 流操纵算子o 流格式状态北京大学程序设计实习课程8流的概念模型o 流-可以看作一个无限长的二进制数字序列o 通过读写指针进行流的读和写(以字节为单位)10

6、10111010101110将流上的数据读进变量x1 0 1 0 1 1 1 011100010将y的值写入流yx北京大学程序设计实习课程9流的概念模型o 输出流 n 可以看作一端无限,另一端通过写指针不停地向后写入新内容的单向流,11 00011010写指针北京大学程序设计实习课程10流的概念模型o 输入流 n 可以看作一端无限,另一端通过读指针不停地从流中读取新内容的单向流,读出的内容从流中删去。11 00011010读指针北京大学程序设计实习课程11有格式读写和无格式读写o 有格式读写,以某种数据类型为单位读写n 例如:读一个整数,写一个浮点数等;o 无格式读写,以字节为单位读写,不区分

7、其中的内容n 例如:读20个字节,写50个字节等;北京大学程序设计实习课程12缓冲区刷新o 向输出流中写数据时,通常是先向缓冲区中写,当缓冲区写满时,才真正向输出流写o 也可以通过函数在程序中主动将缓冲区内容写入输出流。北京大学程序设计实习课程13C+中与流操作相关的类及其继承关系iosistreamostreamifstreamiostreamofstreamfstream北京大学程序设计实习课程14标准流对象o 输入流对象n cin 与标准输入设备相连o 输出流对象:n cout 与标准输出设备相连 n cerr 与标准错误输出设备相连,非缓冲输出 n clog 与标准错误输出设备相连,缓

8、冲输出 北京大学程序设计实习课程15输出流o 流插入运算符 cout “Good morning!n”;不刷新缓冲区 cout “Good”;不刷新缓冲区 cout “morning!”;不刷新缓冲区 cout endl;刷新缓冲区 cout flush;刷新缓冲区n cout显示内容的时候会先将欲显示内容存放在缓存区,待刷新的时候才将内容付显,而具有刷新功能的语句为endl或者flush。北京大学程序设计实习课程16输出流o 输出表达式 cout (47+53);/将表达式括起来,/避免优先级冲突。o 连续使用流插入运算符 cout “ha ha”(100+100)endl;相当于 (cou

9、t “ha ha”)(100+100)endl;北京大学程序设计实习课程17输出流o 输出 char*类型的变量 char*string=“test”;cout string;/以strlen()给出的长度计 /输出字符串内容 /test cout static_cast(string);/输出 string的地址 /0 x0042501c -会变的!用法:static_cast (a)将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。表达式static_cast(a),a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。北京大学程序设计实习课

10、程18输出流o 用成员函数put输出字符 cout.put(A);o put的连续使用 cout.put(A).put(a);北京大学程序设计实习课程19输入流o 读取运算符 int x,y;cin x;cin y;或者 cin x y;北京大学程序设计实习课程20输入流o 读取运算的返回值o 重载运算符的定义:istream&operator(istream&input,A&a).return input;o 返回的是输入流的引用(引用本身是地址),在读取不成功时,该地址被置成 0.所以可以用如下方法判输入结束:int x;while(cinx)北京大学程序设计实习课程21输入流o 成员函数

11、 o cin.get()读入一个字符(包括空白字符),返回该字符;char*cin.get(char*buffer,int size,char delim=n)或者读size 1 个字符入buffer,或者遇到n;在buffer最后加0,分隔符留在输入流.o char*cin.getline(char*buffer,int size,char delim=n)或者读size 1 个字符入buffer,或者遇到n;在buffer最后加0,分隔符从流去掉.o bool cin.eof()返回输入是否结束标志.北京大学程序设计实习课程22输入流o cin.peek():返回下一个字符,但不从流中去掉

12、.o cin.putback(char ch):将字符ch放回输入流o cin.gcount():返回上次读入的字节数o cin.ignore(int nCount=1,int delim=EOF):从流中删掉最多nCount个字符,遇到EOF时结束。北京大学程序设计实习课程23无格式输入输出o 用read,write 进行指定字节数的输入输出const int SIZE=80;char bufferSIZE;cin.read(buffer,20);/cin.get(buffer,20);cout.write(buffer,cin.gcount();/gcount返回上次读入的字节数cout

13、endl;输入:Using the read,write and gcount member functions 输出:Using the read,write北京大学程序设计实习课程24流操纵算子o 整数流的基数:流操纵算子dec,oct,hex,setbaseo 浮点数的精度(precision,setprecision)o 设置域宽(setw,width)o 用户自定义的流操纵算子北京大学程序设计实习课程25流操纵算子o 整数流的基数:流操纵算子dec,oct,hex int n=10;cout n endl;cout hex n “n”dec n “n”oct n setprecisi

14、on(5);/可以连续输出o 它们的功能相同。北京大学程序设计实习课程27流操纵算子o 流格式操纵算子setioflags nsetiosflags(ios:fixed)用定点方式表示实数nseiosflags(ios:scientific)用指数方式表示实数o setiosflags(ios:fixed)与seiosflags(ios:scientific)都可以和setprecision(n)合用,其效果分别为:控制小数点右边的数字个数,控制指数表示法的小数位数。n在用浮点表示的输出中,setprecision(n)表示有效位数。n在用定点表示的输出中,setprecision(n)表示小

15、数位数。n在用指数形式输出时,setprecision(n)表示小数位数。n小数位数截短显示时,进行4舍5入处理。o 左右对齐输出可用setiosflags(ios:left)和setiosflags(ios:right)实现。o 强制显示小数点和符号可用setiosflags(ios:showpoint)和setiosflags(ios:showpos)实现。北京大学程序设计实习课程28流操纵算子o 浮点数的精度(precision,setprecision)double x=12.3456789,y=12.34;cout setiosflags(ios:fixed)setprecision

16、(6)x endl y endl;o 输出为:12.345679 /小数点后有6位 12.340000北京大学程序设计实习课程29流操纵算子o 浮点数的精度(precision,setprecision)double x=12.3456789,y=12.34;long z=1234567cout setprecision(6)x endl y endl z setw(5);或者 cin.width(5);cout string)90 cout.width(w+);cout string string)cout.width(w+);cout string string;567890 cout s

17、tring string;cout string string;5678 cout string string;cout string endl;(输出具有同样的性质)北京大学程序设计实习课程35流操纵算子o 用户自定义的流操纵算子ostream&tab(ostream&output)return output t;cout “aa”tab “bb”endl;输出:aa bb北京大学程序设计实习课程36流的错误状态o 当流中发生格式错误时,设置failbito 当发生导致数据丢失错误时,设置badbito 如果eofbit、failbit、badbit都没有设置,则设置goodbito 成员函

18、数rdstate返回流的错误状态。o 成员函数clear把一个流的状态恢复为“好”,如:cin.clear(),清除cin,并为流设置goodbit。o eof():判断流是否到文件尾北京大学程序设计实习课程37流格式状态o 自己阅读 V2版的11.7(V5版的15.7),学会设置流格式状态北京大学程序设计实习课程38内容提要o 输入输出流o 文件操作o 作业北京大学程序设计实习课程39文件操作o 数据的层次o 文件和流o 建立顺序文件o 文件的读写指针o 有格式读写o 无格式读写北京大学程序设计实习课程40数据的层次o 位 bito 字节 byteo 域/记录 Field/Record例如:

19、学生记录 int ID;char name10;int age;int rank10;o 我们将所有记录顺序地写入一个文件,称为顺序文件。北京大学程序设计实习课程41文件和流o 可以将顺序文件看作一个有限字符构成的顺序字符流,然后象对cin,cout 一样的读写。回顾一下输入输出流类的结构层次:iosistreamostreamifstreamiostreamofstreamfstream北京大学程序设计实习课程42建立顺序文件o#include /包含头文件o ofstream outFile(“clients.dat”,ios:out|ios:binary);/打开文件n ofstream

20、 是 fstream中定义的类n outFile 是我们定义的ofstream类的对象n“clients.dat”是将要建立的文件的文件名n ios:out 是打开并建立文件的选项p ios:out 输出到文件,删除原有内容p ios:app 输出到文件,保留原有内容,总是在尾部添加p ios:ate 输出到文件,保留原有内容,可以在文件任意位置添加 n ios:binary 以二进制文件格式打开文件北京大学程序设计实习课程43建立顺序文件o 也可以先创建ofstream对象,再用 open函数打开 ofstream fout;fout.open(test.out,ios:out|ios:bi

21、nary);o 判断打开是否成功:if(!fout)cerr “File open error!”x y;fout x “y endl;o 说明:n 字符文件的读写本质是将所有类型转为字符串,再将字符串转成各种类型的数据。n 所以写出来的是文本格式的文件,可以在记事本中阅读。n 因为文件流也是流,所以前面讲过的流的成员函数和流操作算子也同样适用于文件流。北京大学程序设计实习课程48二进制文件读写int x=10;fout.seekp(20,ios:beg);fout.write(reinterpret_cast(&x),sizeof(int);fin.seekg(0,ios:beg);fin.

22、read(reinterpret_cast(&x),sizeof(int);o 二进制文件读写,直接写二进制数据,记事本看未必正确。reinterpret_cast(a)任何指针都可以转换成其它类型的指针,T必须是一个指针、引用、算术类型、指向函数的指针或指向一个类成员的指针。表达式reinterpret_cast(a)能够用于诸如能够用于诸如char*到到int*。北京大学程序设计实习课程49显式关闭文件 ifstream fin(“test.dat”,ios:in);fin.close();ofstream fout(“test.dat”,ios:out);fout.close();北京大

23、学程序设计实习课程50获得文件长度ofstream fout(1.txt,ios:out);char a100000;fout.write(reinterpret_cast(a),100000);fout.close();ifstream fin(1.txt,ios:in);fin.read(reinterpret_cast(a),100000);fin.seekg(0,ios:end);long b=fin.tellg();cout b settings-debug-program arguments北京大学程序设计实习课程52命令行参数int main(int argc,char*argv

24、)cout argc endl;for(int i=0;iargc;i+)cout argvi endl;o 第一个参数为命令本身,第二个以后为参数北京大学程序设计实习课程53文件目录操作o dir -列文件及子目录o cd -当前目录转换o mkdir -创建目录o .目录 -当前目录o.目录 -父目录北京大学程序设计实习课程54在程序中得到某个路径下的文件#include HANDLE f1;/句炳WIN32_FIND_DATA fData;/存储文件信息f1=FindFirstFile(e:/teaching/*,&fData);cout fData.cFileName endl;if(

25、fData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY)cout directiory endl;else cout file endl;北京大学程序设计实习课程55在程序中得到某个路径下的文件while(FindNextFile(f1,&fData)cout fData.cFileName endl;if(fData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY)cout directiory endl;else

26、 cout file 100 pixel=0 else pixel=2558.创建新文件 9.如果创建失败,释放内存,处理创建失败,退出10.将新数组写进新文件11.释放动态数组12.关闭新文件13.程序结束北京大学程序设计实习课程58内容提要o 输入输出流o 文件操作o 作业北京大学程序设计实习课程59作业o 书上:阅读V2版的11.7(或V5版的15.7)o 完成练习 V2版的11.12(或V5版的15.12)o 几何形体练习3n以几何形体练习2为基础n在基类中加两个虚函数setfromfile(),printtofile()分别用于文件读写,文件统一后缀.geo,在输入文件名时不必输入。

27、向文件输出时注意在每个输出后要输出 或n,否则从文件输入时会出错。从文件输入时,只能屏幕输出,输出结果是按周长大小排序的。而从键盘输入时可以选择是屏幕输出还是文件输出,但都是按面积大小排序的。这点区别请注意。o 文件压缩,题目描述放在作业网页上。可以迟些(1-2周)交这个作业。北京大学程序设计实习课程60强制类型转换运算符o static_cast(a)n 将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。n 表达式static_cast(a),a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。class B .;class D:public

28、 B .;void f(B*pb,D*pd)D*pd2=static_cast(pb);/不安全,pb可能只是B的指针 B*pb2=static_cast(pd);/安全的 .北京大学程序设计实习课程61强制类型转换运算符o dynamic_cast(a)n 完成类层次结构中的提升。T必须是一个指针、引用或无类型的指针。a必须是决定一个指针或引用的表达式。n 表达式dynamic_cast(a)将a值转换为类型为T的对象指针。如果类型T不是a的某个基类型,该操作将返回一个空指针。classA.;classB.;voidf()A*pa=newA;B*pb=newB;void*pv=dynamic

29、_cast(pa);/pv现在指向了一个类型为现在指向了一个类型为A的对象的对象 .pv=dynamic_cast(pb);/pv现在指向了一个类型为现在指向了一个类型为B的对象的对象 北京大学程序设计实习课程62强制类型转换运算符o const_cast(a)n 去掉类型中的常量,除了const或不稳定的变址数,T和a必须是相同的类型。n 表达式const_cast(a)被用于从一个类中去除以下这些属性:const,volatile,和 _unaligned。classA.;voidf()constA*pa=newA;/const对象 A*pb;/非const对象 /pb=pa;/这里将出错

30、,不能将const对象指针赋值给非const对象 pb=const_cast(pa);/现在OK了 .北京大学程序设计实习课程63强制类型转换运算符o reinterpret_cast(a)n 任何指针都可以转换成其它类型的指针,T必须是一个指针、引用、算术类型、指向函数的指针或指向一个类成员的指针。n 表达式reinterpret_cast(a)能够用于诸如char*到 int*,或者One_class*到 Unrelated_class*等类似这样的转换,因此可能是不安全的。classA.;classB.;voidf()A*pa=newA;void*pv=reinterpret_cast(

31、pa);/pv现在指向了一个类型为B的对象,这可能是不安全的.北京大学程序设计实习课程64static_cast和reinterpret_cast区别 o假设你想把一个int转换成double,以便让包含int类型变量的表达式产生出浮点数值的结果。如用C风格的类型转换,你能这样写:n int firstNumber,secondNumber;double result =(double)firstNumber)/secondNumber;n如果用上述新的类型转换方法,你应该这样写:double result =static_cast(firstNumber)/secondNumber;这样的类型转换不论是对人工还是对程序都很容易识别。oreinterpret_casts的最普通的用途就是在函数指针类型之间进行转换。其的转换结果几乎都是执行期定义(implementation-defined)。因此,使用reinterpret_casts的代码很难移植。ntypedef void (*FuncPtr)();FuncPtr funcPtrArray10;funcPtrArray0 =&doSomething;/错误!类型不匹配 funcPtrArray0 =reinterpret_cast(&doSomething);

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|