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

上传人:wuy****n92 文档编号:91085381 上传时间:2023-05-21 格式:PPT 页数:64 大小:230.16KB
返回 下载 相关 举报
程序设计实习第十八讲输入输出流和文件操作.ppt_第1页
第1页 / 共64页
程序设计实习第十八讲输入输出流和文件操作.ppt_第2页
第2页 / 共64页
点击查看更多>>
资源描述

《程序设计实习第十八讲输入输出流和文件操作.ppt》由会员分享,可在线阅读,更多相关《程序设计实习第十八讲输入输出流和文件操作.ppt(64页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

2、basestringname()returnbasename;virtualvoidprint(ostream&os)osbasename;private:basename;classderivedvoidprint()print(ostream&os);os“”mem;private:intmeme;classderived:publicbasevoidprint()base:print(os);os“”mem;private:intmeme;同时,基类及派生类也应该定义构造函数和析构函数。base:base(stringname):basename(name);base:base();de

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

4、派生类中添加。d)重载函数在编译时,根据传递参数序列的不同,确定具体调用表现多态性,而虚函数在运行时,根据基类指针或引用所指向对象的不同,确定具体调用表现出多态性。4北京大学程序设计实习课程课堂问题(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()void

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

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

7、大学程序设计实习课程缓冲区刷新o向输出流中写数据时,通常是先向缓冲区中写,当缓冲区写满时,才真正向输出流写o也可以通过函数在程序中主动将缓冲区内容写入输出流。12北京大学程序设计实习课程C+中与流操作相关的类及其继承关系iosistreamostreamifstreamiostreamofstreamfstream13北京大学程序设计实习课程标准流对象o输入流对象ncin与标准输入设备相连o输出流对象:ncout与标准输出设备相连ncerr与标准错误输出设备相连,非缓冲输出nclog与标准错误输出设备相连,缓冲输出14北京大学程序设计实习课程输出流o流插入运算符cout“Goodmorning

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

9、test”;coutstring;/以strlen()给出的长度计/输出字符串内容/testcoutstatic_cast(string);/输出string的地址/0 x0042501c-会变的!用法:static_cast (a)将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。表达式static_cast(a),a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。17北京大学程序设计实习课程输出流o用成员函数put输出字符cout.put(A);oput的连续使用cout.put(A).put(a);18北京大学程序设计实习课程输入流o读

10、取运算符intx,y;cinx;ciny;或者cinxy;19北京大学程序设计实习课程输入流o读取运算的返回值o重载运算符的定义:istream&operator(istream&input,A&a).returninput;o返回的是输入流的引用(引用本身是地址),在读取不成功时,该地址被置成0.所以可以用如下方法判输入结束:intx;while(cinx)20北京大学程序设计实习课程输入流o成员函数ocin.get()读入一个字符(包括空白字符),返回该字符;char*cin.get(char*buffer,intsize,chardelim=n)或者读size1个字符入buffer,或者

11、遇到n;在buffer最后加0,分隔符留在输入流.ochar*cin.getline(char*buffer,intsize,chardelim=n)或者读size1个字符入buffer,或者遇到n;在buffer最后加0,分隔符从流去掉.oboolcin.eof()返回输入是否结束标志.21北京大学程序设计实习课程输入流ocin.peek():返回下一个字符,但不从流中去掉.ocin.putback(charch):将字符ch放回输入流ocin.gcount():返回上次读入的字节数ocin.ignore(int nCount=1,int delim=EOF):从流中删掉最多nCount个字

12、符,遇到EOF时结束。22北京大学程序设计实习课程无格式输入输出o用read,write进行指定字节数的输入输出constintSIZE=80;charbufferSIZE;cin.read(buffer,20);/cin.get(buffer,20);cout.write(buffer,cin.gcount();/gcount返回上次读入的字节数coutendl;输入:Usingtheread,writeandgcountmemberfunctions输出:Usingtheread,write23北京大学程序设计实习课程流操纵算子o整数流的基数:流操纵算子dec,oct,hex,setbas

13、eo浮点数的精度(precision,setprecision)o设置域宽(setw,width)o用户自定义的流操纵算子24北京大学程序设计实习课程流操纵算子o整数流的基数:流操纵算子dec,oct,hexintn=10;coutnendl;couthexn“n”decn“n”octnsetprecision(5);/可以连续输出o它们的功能相同。26北京大学程序设计实习课程流操纵算子o流格式操纵算子setioflagsnsetiosflags(ios:fixed)用定点方式表示实数nseiosflags(ios:scientific)用指数方式表示实数osetiosflags(ios:fi

14、xed)与seiosflags(ios:scientific)都可以和setprecision(n)合用,其效果分别为:控制小数点右边的数字个数,控制指数表示法的小数位数。n在用浮点表示的输出中,setprecision(n)表示有效位数。n在用定点表示的输出中,setprecision(n)表示小数位数。n在用指数形式输出时,setprecision(n)表示小数位数。n小数位数截短显示时,进行4舍5入处理。o左右对齐输出可用setiosflags(ios:left)和setiosflags(ios:right)实现。o强制显示小数点和符号可用setiosflags(ios:showpoin

15、t)和setiosflags(ios:showpos)实现。27北京大学程序设计实习课程流操纵算子o浮点数的精度(precision,setprecision)doublex=12.3456789,y=12.34;coutsetiosflags(ios:fixed)setprecision(6)xendlyendl;o输出为:12.345679/小数点后有6位12.34000028北京大学程序设计实习课程流操纵算子o浮点数的精度(precision,setprecision)doublex=12.3456789,y=12.34;longz=1234567coutsetprecision(6)x

16、endlyendlzsetw(5);或者cin.width(5);coutstring)90cout.width(w+);coutstringstring)cout.width(w+);coutstringstring;567890coutstringstring;coutstringstring;5678coutstringstring;coutstringendl;(输出具有同样的性质)34北京大学程序设计实习课程流操纵算子o用户自定义的流操纵算子ostream&tab(ostream&output)returnoutputt;cout“aa”tab“bb”endl;输出:aabb35北京

17、大学程序设计实习课程流的错误状态o当流中发生格式错误时,设置failbito当发生导致数据丢失错误时,设置badbito如果eofbit、failbit、badbit都没有设置,则设置goodbito成员函数rdstate返回流的错误状态。o成员函数clear把一个流的状态恢复为“好”,如:cin.clear(),清除cin,并为流设置goodbit。oeof():判断流是否到文件尾36北京大学程序设计实习课程流格式状态o自己阅读V2版的11.7(V5版的15.7),学会设置流格式状态37北京大学程序设计实习课程内容提要o输入输出流o文件操作o作业38北京大学程序设计实习课程文件操作o数据的层

18、次o文件和流o建立顺序文件o文件的读写指针o有格式读写o无格式读写39北京大学程序设计实习课程数据的层次o位bito字节byteo域/记录Field/Record例如:学生记录intID;charname10;intage;intrank10;o我们将所有记录顺序地写入一个文件,称为顺序文件。40北京大学程序设计实习课程文件和流o可以将顺序文件看作一个有限字符构成的顺序字符流,然后象对cin,cout一样的读写。回顾一下输入输出流类的结构层次:iosistreamostreamifstreamiostreamofstreamfstream41北京大学程序设计实习课程建立顺序文件o#includ

19、e/包含头文件oofstreamoutFile(“clients.dat”,ios:out|ios:binary);/打开文件nofstream是fstream中定义的类noutFile是我们定义的ofstream类的对象n“clients.dat”是将要建立的文件的文件名nios:out是打开并建立文件的选项pios:out输出到文件,删除原有内容pios:app输出到文件,保留原有内容,总是在尾部添加pios:ate输出到文件,保留原有内容,可以在文件任意位置添加nios:binary以二进制文件格式打开文件42北京大学程序设计实习课程建立顺序文件o也可以先创建ofstream对象,再用o

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

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

22、“test.dat”,ios:out);fout.close();49北京大学程序设计实习课程获得文件长度ofstreamfout(1.txt,ios:out);chara100000;fout.write(reinterpret_cast(a),100000);fout.close();ifstreamfin(1.txt,ios:in);fin.read(reinterpret_cast(a),100000);fin.seekg(0,ios:end);longb=fin.tellg();coutbsettings-debug-programarguments51北京大学程序设计实习课程命令行

23、参数intmain(intargc,char*argv)coutargcendl;for(inti=0;iargc;i+)coutargviendl;o第一个参数为命令本身,第二个以后为参数52北京大学程序设计实习课程文件目录操作odir-列文件及子目录ocd-当前目录转换omkdir-创建目录o.目录-当前目录o.目录-父目录53北京大学程序设计实习课程在程序中得到某个路径下的文件#includeHANDLEf1;/句炳WIN32_FIND_DATAfData;/存储文件信息f1=FindFirstFile(e:/teaching/*,&fData);coutfData.cFileNamee

24、ndl;if(fData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY)coutdirectioryendl;elsecoutfileendl;54北京大学程序设计实习课程在程序中得到某个路径下的文件while(FindNextFile(f1,&fData)coutfData.cFileNameendl;if(fData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY)coutdirectioryendl;elseco

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

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

27、=static_cast(pb);/不安全,pb可能只是B的指针B*pb2=static_cast(pd);/安全的.60北京大学程序设计实习课程强制类型转换运算符odynamic_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_cast(pa);/pv现在指向了一个类型为现在指向了一个类型

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

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

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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁