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

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《程序设计实习》课程(C++ProgrammingPractice)程序设计实习第十八讲输入输出流和文件操作主讲教师:田永鸿yhtian@pku.edu.cn://idm.pku.edu.cn/jiaoxue-CPP/cpp08.htm2008年5月12日北京大学《程序设计实习》课程2上节内容回顾虚函数和多态纯虚函数和抽象类多态的实现:虚函数表虚函数的访问权限构造函数和析构函数中调用虚函数虚析构函数北京大学《程序设计实习》课程3课堂问题(1)1.判断对错并说明理由a)抽象基类中的所有virtual函数都必须声明为纯virtual函数;b)声明某个类为virtual,该类就成为抽象类。c)如果基类声明了一个纯virtual函数,派生类只有实现该函数才能成为具体类。2.下面的定义是否正确,该如何改正?classbase{stringname(){returnbasename;}virtualvoidprint(ostream&os){osbasename;}private:basename;}classderived{voidprint(){print(ostream&os);os“”mem;}private:intmeme;}classderived:publicbase{voidprint(){base::print(os);os“”mem;}private:intmeme;}同时,基类及派生类也应该定义构造函数和析构函数。base::base(stringname):basename(name){};base::~base(){};derived::derived(stringname,intval):base(name),mem(val){};derived::~derived(){};北京大学《程序设计实习》课程4课堂问题(2)3.下列关于重载函数和虚函数的辨析描述中,理解不正确的是:a)重载函数处理的是同一类层次上的同名函数问题,而虚函数处理的是不同派生层次上的同名函数问题。b)重载函数要求函数有相同的函数名称,不管返回值类型是否相同,但参数序列必须不同,而虚函数则要求函数名、参数序列和返回值类型完全相同。c)重载函数和虚函数都必须是类成员函数,但重载函数一般功能类似,而虚函数一般功能有所不同,甚至基类虚函数的函数体可以为空,具体功能在派生类中添加。d)重载函数在编译时,根据传递参数序列的不同,确定具体调用表现多态性,而虚函数在运行时,根据基类指针或引用所指向对象的不同,确定具体调用表现出多态性。北京大学《程序设计实习》课程5课堂问题(3)4.请写出运行时输出的结果classA{public:A(){}virtualvoidfunc(){coutA::funcendl;}~A(){}virtualvoidfund(){coutA::fundendl;}};classB:publicA{public:B(){func();}voidfun(){func();}~B(){fund();}};classC:publicB{public:C(){}voidfunc(){coutC::funcendl;}~C(){fund();}voidfund(){coutC::fundendl;}};main(){Cc;}A::funcC::fundA::fund北京大学《程序设计实习》课程6内容提要输入输出流文件操作作业北京大学《程序设计实习》课程7输入输出流流的概念模型C++中与流操作相关的类及其继承关系输入输出流对象:cin,cout,cerr,clog输出流输入流无格式输入输出流操纵算子流格式状态北京大学《程序设计实习》课程8流的概念模型流---可以看作一个无限长的二进制数字序列通过读写指针进行流的读和写(以字节为单位)~10101110~~10101110~将流上的数据读进变量x1010111011100010将y的值写入流yx北京大学《程序设计实习》课程9流的概念模型输出流可以看作一端无限,另一端通过写指针不停地向后写入新内容的单向流,1100011010~写指针北京大学《程序设计实习》课程10流的概念模型输入流可以看作一端无限,另一端通过读指针不停地从流中读取新内容的单向流,读出的内容从流中删去。1100011010~读指针北京大学《程序设计实习》课程11有格式读写和无格式读写有格式读写,以某种数据类型为单位读写例如:读一个整数,写一个浮点数等;无格式读写,以字节为单位读写,不区分其中的内容例如:读20个字节,写50个字节等;北京大学《程序设计实习》课程12缓冲区刷新向输出流中写数据时,通常是先向缓冲区中写,当缓冲区写满时,才真正向输出流写也可以通过函数在程序中主动将缓冲区内容写入输出流。北京大学《程序设计实习》课程13C++中与流操作相关的类及其继承关系iosistreamostreamifstreamiostreamofstreamfstream北京大学《程序设计实习》课程14标准流对象输入流对象cin与标准输入设备相连输出流对象:cout与标准输出设备相连cerr与标准错误输出设备相连,非缓冲输出clog与标准错误输出设备相连,缓冲输出北京大学《程序设计实习》课程15输出流流插入运算符cout“Goodmorning!\n”;不刷新缓冲区cout“Good”;不刷新缓冲区cout“morning!”;不刷新缓冲区coutendl;刷新缓冲区coutflush;刷新缓冲区cout显示内容的时候会先将欲显示内容存放在缓存区,待刷新的时候才将内容付显,而具有刷新功能的语句为endl或者flush。北京大学《程序设计实习》课程16输出流输出表达式cout(47+53);//将表达式括起来,//避免优先级冲突。连续使用流插入运算符cout“haha”(100+100)endl;相当于((cout“haha”)(100+100))endl;北京大学《程序设计实习》课程17输出流输出char*类型的变量char*string=“test”;coutstring;//以strlen()给出的长度计//输出字符串内容//testcoutstatic_castvoid*(string);//输出string的地址//0x0042501c--会变的!用法:static_castT*(a)将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。表达式static_castT*(a),a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。北京大学《程序设计实习》课程18输出流用成员函数put输出字符cout.put(‘A’);put的连续使用cout.put(‘A’).put(‘a’);北京大学《程序设计实习》课程19输入流读取运算符intx,y;cinx;ciny;或者cinxy;北京大学《程序设计实习》课程20输入流读取运算的返回值重载运算符的定义:istream&operator(istream&input,A&a){…….returninput;}返回的是输入流的引用(引用本身是地址),在读取不成功时,该地址被置成0.所以可以用如下方法判输入结束:intx;while(cinx){…}北京大学《程序设计实习》课程21输入流成员函数cin.get()读入一个字符(包括空白字符),返回该字符;char*cin.get(char*buffer,intsize,chardelim=‘\n’)或者读size–1个字符入buffer,或者遇到‘\n’;在buffer最后加‘\0’,分隔符留在输入流.char*cin.getline(char*buffer,intsize,chardelim=‘\n’)或者读size–1个字符入buffer,或者遇到‘\n’;在buffer最后加‘\0’,分隔符从流去掉.boolcin.eof()返回输入是否结束标志.北京大学《程序设计实习》课程22输入流cin.peek():返回下一个字符,但不从流中去掉.cin.putback(charch):将字符ch放回输入流cin.gcount():返回上次读入的字节数cin.ignore(intnCount=1,intdelim=EOF):从流中删掉最多nCount个字符,遇到EOF时结束。北京大学《程序设计实习》课程23无格式输入输出用read,write进行指定字节数的输入输出constintSIZE=80;charbuffer[SIZE];cin.read(buffer,20);//cin.get(buffer,20);cout.write(buffer,cin.gcount());//gcount返回上次读入的字节数coutendl;输入:Usingtheread,writeandgcountmemberfunctions输出:Usingtheread,write北京大学《程序设计实习》课程24流操纵算子整数流的基数:流操纵算子dec,oct,hex,setbase浮点数的精度(precision,setprecision)设置域宽(setw,width)用户自定义的流操纵算子北京大学《程序设计实习》课程25流操纵算子整数流的基数:流操纵算子dec,oct,hexintn=10;coutnendl;couthexn“\n”decn“\n”octnendl;输出结果:10a1012北京大学《程序设计实习》课程26流操纵算子浮点数的精度(precision,setprecision)precision是成员函数,其调用方式为:cin.precision(5);setprecision是流操作算子,其调用方式为:cinsetprecision(5);//可以连续输出它们的功能相同。北京大学《程序设计实习》课程27流操纵算子流格式操纵算子setioflagssetiosflags(ios::fixed)用定点方式表示实数seiosflags(ios::scientific)用指数方式表示实数setiosflags(ios::fixed)与seiosflags(ios::scientific)都可以和setprecision(n)合用,其效果分别为:控制小数点右边的数字个数,控制指数表示法的小数位数。在用浮点表示的输出中,setprecision(n)表示有效位数。在用定点表示的输出中,setprecision(n)表示小数位数。在用指数形式输出时,setprecision(n)表示小数位数。小数位数截短显示时,进行4舍5入处理。左右对齐输出可用setiosflags(ios::left)和setiosflags(ios::right)实现。强制显示小数点和符号可用setiosflags(ios::showpoint)和setiosflags(ios::showpos)实现。北京大学《程序设计实习》课程28流操纵算子浮点数的精度(precision,setprecision)doublex=12.3456789,y=12.34;coutsetiosflags(ios::fixed)setprecision(6)xendlyendl;输出为:12.345679//小数点后有6位12.340000北京大学《程序设计实习》课程29流操纵算子浮点数的精度(precision,setprecision)doublex=12.3456789,y=12.34;long

1 / 64
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功