C--与面向对象的程序设计---程序员联合开发网.ppt课件

上传人:风*** 文档编号:252632899 上传时间:2024-11-18 格式:PPT 页数:58 大小:262.55KB
返回 下载 相关 举报
C--与面向对象的程序设计---程序员联合开发网.ppt课件_第1页
第1页 / 共58页
C--与面向对象的程序设计---程序员联合开发网.ppt课件_第2页
第2页 / 共58页
C--与面向对象的程序设计---程序员联合开发网.ppt课件_第3页
第3页 / 共58页
点击查看更多>>
资源描述
,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,流类库与输入/输出,流类库与输入/输出,1,本讲主要内容,I/O,流的概念,输出流,输入流,本讲主要内容I/O流的概念,2,为什么要有,C+,流类库,C,语言的输入输出系统不支持拥护自定义的对象或数据类型,如一定义:,struct sample,int i ;,float f;,char *ch;,s1;,不能用输出函数来输出以上结构变量:,printf(“%sample”,s1);,I/O,流的概念,为什么要有C+流类库C语言的输入输出系统不支持拥护自定义的,3,为什么要有,C+,流类库,C+,中,用户自定义的对象很多。,C+,的类机制允许它可以建立一个可控制的输入输出系统。可以通过重载“”算符来解决以上的问题。,I/O,流的概念,为什么要有C+流类库C+中,用户自定义的对象很多。C+,4,流类库和流,流,在数据从一个对象流动到另一个对象的过程中,无论是否对数据进行缓冲或对数据进行格式变换,这种流动都被抽象为流.,每个流都和一种与设备相联系。,与输入设备(如键盘)联系的流为输入流;与输出设备(如屏幕)联系的流为输出流。,C+,中预定义了标准输入流,cin、,标准输出流,cout、,非缓冲的出错流,cerr,和缓冲的出错流,clog。,I/O,流的概念,流类库和流流I/O流的概念,5,流类库和流,在缺省情况下,标准输出设备是显示终端,标准输入设备是键盘。,在任何情况下,标准错误输出设备总是显示终端。,标准输出设备可以不是显示终端;但错误信息总是在显示屏幕上显示。,流在使用前要被建立,在使用后要被删除,使用特定的操作能够从流中获取数据(称为提取操作),或向流中添加数据(称为插入操作).,I/O,流的概念,流类库和流在缺省情况下,标准输出设备是显示终端,标准输入设备,6,输出流,输出流对象是信息流动的目标.,ostream, ofstream,和,ostrstream,是三个最重要的输出流.,ostream,类通过派生类,ostream_withassign,支持预先定义的流对象,cout,标准输出,cerr,标准错误输出,没有缓冲,发给它的内容立即输出,clog,类似于,cerr,但有缓冲,缓冲区满时被输出.,ofstream,类支持磁盘文件输出.,ostrstream,类支持输出字符串。,输出流输出流对象是信息流动的目标. ostream,7,文件,在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目录之下。,一个文件名由文件主名和扩展名两部分组成,它们之间用圆点(即小数点)分开,扩展名可以省略,当省略时也要省略掉前面的圆点。文件主名是由用户命名的一个有效的,C+,标识符,为了同其他软件系统兼容,一般让文件主名为不超过,8,个有效字符的标识符,同时为了便于记忆和使用,最好使文件主名的含义与所存的文件内容相一致。,输出流,文件 在磁盘上保存的信息是按文件的形式组织的,8,文件扩展名也是由用户命名的、,1,至,3,个字符组成的、有效的,C+,标识符,通常用它来区分文件的类型。,如在,C+,系统中,用扩展名,h,表示头文件,用扩展名,cpp,表示程序文件,用,obj,表示程序文件被编译后生成的目标文件,用,exe,表示连接整个程序中所有目标文件后生成的可执行文件。,对于用户建立的用于保存数据的文件,通常用,dat,表示扩展名,若它是由字符构成的文本文件则也用,txt,作为扩展名,若它是由字节构成的、能够进行随机存取的内部格式文件则可用,ran,表示扩展名。,文件扩展名也是由用户命名的、1至3个字,9,在,C+,程序中使用的保存数据的文件按存储格式分为两种类型,一种为字符格式文件,简称字符文件,另一种为内部格式文件,简称字节文件。字符文件又称,ASCII,码文件或文本文件,字节文件又称二进制文件。,在字符文件中,每个字节单元的内容为字符的,ASCII,码,被读出后能够直接送到显示器或打印机上显示或打印出对应的字符,供人们直接阅读。,在字节文件中,文件内容是数据的内部表示,是从内存中直接复制过来的。当然对于字符信息,数据的内部表示就是,ASCII,码表示,所以在字符文件和在字节文件中保存的字符信息没有差别,但对于数值信息,数据的内部表示和,ASCII,码表示截然不同,所以在字符文件和在字节文件中保存的数值信息也截然不同。,在C+程序中使用的保存数据的文件,10,要在程序中使用文件时,首先要在开始包含,#include,命令。由它提供的输入文件流类,ifstream,、输出文件流类,ofstream,和输入输出文件流类,fstream,定义用户所需要的文件流对象,然后利用该对象调用相应类中的,open,成员函数,按照一定的打开方式打开一个文件。文件被打开后,就可以通过流对象访问它了,访问结束后再通过流对象关闭它。,要在程序中使用文件时,首先要在开始包含#incl,11,文件,在,C+,中,要进行文件的输入输出操作,应该:,先创建一个流对象,如构造一个,ofstream,类的对象,以便进行文件的输出,打开文件,就是将这个流对象和具体的文件相关联,进行文件的读写操作,关闭文件,输出流,文件在C+中,要进行文件的输入输出操作,应该:输出流,12,构造输出流对象和打开文件,如果输出到标准输出设备,即使用预先定义的,cout、cerr、clog,对象,则不需要构造流对象。,要将信息输出到文件,就要构造和建立流对象。,可以先构造对象,再打开文件;也可以在构造对象时,同时打开文件。,输出流,构造输出流对象和打开文件如果输出到标准输出设备,即使用预先定,13,构造输出流对象和打开文件,使用缺省构造函数,再调用,ofstream,类的,open,成员函数.,打开文件时要指定和对象关联文件的文件名,文件的打开方式(,iosmode),:,ofstream,对象,名,;,对象名,.,open(“,文件名,”,iosmode);,如:,ofstream,outfile,;,outfile.open(“,data.dat,”,ios:binary);,输出流,构造输出流对象和打开文件使用缺省构造函数,再调用ofstre,14,构造输出流对象和打开文件,也可使用指针,即指向输出文件流对象的指针,通过指针调用,open,函数:,ofstream *pmyFile = new ofstream;,pmyFile-open(“filename”,iosmode);,输出流,构造输出流对象和打开文件也可使用指针,即指向输出文件流对象的,15,构造输出流对象和打开文件,也,可以一次操作就完成构造输出流对象和打开文件。即只调用构造函数,而不使用,open,函数。,在调用构造函数时指定文件名和模式,ofstream,对象名,(“,文件名,”,iosmode);,如:,ofstream,outfile (“,data.dat,”,ios;binary);,(,常用方式),输出流,构造输出流对象和打开文件也可以一次操作就完成构造输出流对象和,16,使用插入运算符和控制格式,插入运算符是预先设计的,用来将数据输出到一个流对象。,插入运算符与预先定义的操纵符一起工作,用来控制输出格式,通过已定义的操纵符可以控制输出宽度、输出格式、输出精度等。,输出流,使用插入运算符和控制格式插入运算符是预先设计的,用来将数,17,控制输出宽度,可,使用,setw,操纵符或,width,成员函数来控制每个输出项的输出宽度:,#,include,void main( ),doubl evalues=1.23,35,36,653.7,4358.24;,for (int i=0;i4;i+),cout.width(10);,coutvaluesIn;,输出流,控制输出宽度可使用setw操纵符或width成员函数来控制,18,控制输出宽度,用,setw,操纵符来控制输出宽度:,#,include,#include ,void main( ), doubl evalues=1.23,35,36,653.7,4358.24;,char *name=“Jan”, “Ani”, “Pa”, “Yekan”;,for (int i=0;i4;i+),coutsetw(6)namei,setw(10)valuesin;,可以对数据项指定不同的输出宽度。,必须调用,iomanip.h,头文件。,输出流,控制输出宽度用setw操纵符来控制输出宽度:输出流,19,控制输出格式,用,setiosflags,操纵符来设置输出格式,输出结束后,再用,resetiosflags,操纵符取消设置的格式,恢复缺省的格式。,具体的格式由格式标志值指定,可以设置的格式包括:对齐方式,数据的数制(十进、八进、十六进制)、浮点数显示格式等。,格式标志值可以用,OR,运算(|)进行组合。,输出流,控制输出格式用setiosflags操纵符来设置输出格式,20,ios:skipws,Skip white space on input.,ios:left,Left-align values; pad on the right with the fill character.,ios:right,Right-align values; pad on the left with the fill character (,default alignment,).,ios:internal,Add fill characters after any leading sign or base indication, but before the value.,ios:dec,Format numeric values as base 10 (decimal) (,default radix,).,ios:oct,Format numeric values as base 8 (octal).,ios:hex,Format numeric values as base 16 (hexadecimal).,ios:skipws Skip white space,21,ios:showbase,Display numeric constants in a format that can be read by the C+ compiler.,ios:showpoint,Show decimal point and trailing zeros for floating-point values.,ios:uppercase,Display uppercase A through F for hexadecimal values and E for scientific values.,ios:showpos,Show plus signs (+) for positive values.,ios:scientific,Display floating-point numbers in scientific format.,ios:fixed,Display floating-point numbers in fixed format.,ios:unitbuf,Cause ostream:osfx to flush the stream after each insertion. By default, cerr is unit buffered.,ios:stdio,Cause ostream:osfx to flush stdout and stderr after each insertion.,ios:showbase Display numeri,22,例 设置对齐方式,#include,#include,void main( ),double values=1.23, 35.36,653.7,4358.24;,char*names=Zoot, Jimmy, Al, Stan;,for(int i=0;i4;i+),coutsetiosflags(ios:left)/,左对齐,setw(6)namesi,resetiosflags(ios:left)/,恢复默认,setw(10)valuesIendl;,例 设置对齐方式,23,控制输出精度,控制输出精度:用,setprecision,操纵符,#,include,#include,void main( ),double values=1.23,35.36,653.7,4358.24;,char*names=Zoot, Jimmy, Al, Stan;,for(int i=0;i4;i+),coutsetiosflags(ios:left),setw(6)namesi,resetiosflags(ios:left) setw(10)setprecision(1)valuesIendl;,输出流,控制输出精度控制输出精度:用setprecision操纵符,24,程序运行结果:,Zoot 1,Jimmy 4e+001,Al 7e+002,Stan 4e+003,若改为,setprecision(3),,即3位有效数字,结果成为:,Zoot 1.23,Jimmy 35.4,Al 654,Stan 4.36e+003,原数据为,:,1.23, 35.36, 653.7, 4358.24,不必使用resetprecision,可直接修改精度。,程序运行结果:,25,控制输出数制,控制输出进制用,dec,oct,和,hex,操纵符,#,include,#include,void main(),cout234setw(10)hex234endl,234setw(10)oct234endl,234setw(10)dec234endl;,输出流,控制输出数制控制输出进制用dec,oct和hex操纵符输出,26,程序运行结果:,234,ea,ea 352,352 234,程序运行结果:,27,综合示例:ASCII码表,#,include ,#include ,int main(), int i,j=0;,for(i=32;i127;i+), cout setw(4) hexi H setw(2) char(i);,j+;,if (j%8=0) coutendl;,return 0;,综合示例:ASCII码表#include 读写,但要用与文件关联的流对象作为目标:,#,include ,int main(), ofstream fout(“data.dat”);,if(! fout),cout“Cant open file test.txtn”;,return 1 ,fout10“ “123.456读写,但要用与文件关联,33,输出文件流成员函数,(二),输出流的,open,函数,若要用一个输出文件流,必须在构造函数或,open,函数中把该流与一个特定的磁盘文件关联起来.,输出流的,put,函数,把一个字符写到输出流中,输出流的,write,函数,把内存中的一块内容写到一个输出文件流中,长度参数指出写的字节数.,输出流,输出文件流成员函数(二)输出流的open函数输出流,34,例 输出二进制文件,#include,struct Date,int mo,da,yr;,;/,不要忘掉;,void main( ),Date dt = 6,10,92;,ofstream tfile(“date.dat”,ios:binary);,/,打开二进制文件,tfile.write(char*),例 输出二进制文件#include,35,程序运行结果:,文件,date.dat,的内容是:,06 00 00 00 0,A 00 00 00-5C 00 00 00,正好是十进制数6、10、92的二进制表示,每个数4个字节。,程序运行结果:,36,如果以文本方式打开,程序运行结果:,文件,date.dat,的内容是:,06 00 00 00,0,D 0A,00 00-00 5C 00 00 00,十进制数10前面增加了一个0,D,,即换行符的,ASCII,码,其余不变。可见并不能直接按文本方式输出。而且使10的输出(认为是,ASCII,码0,A),变为回车换行符。,如果以文本方式打开,程序运行结果:,37,输出文件流成员函数,(三),输出流的,seekp,和,tellp,函数,一个输出文件流保存一个内部指针指出下一次写数据的位置.,seekp,设置这个指针.,tellp,返回该文件位置.,输出流的,close,函数,close,关闭与一个输出文件流关联的磁盘文件.,输出流的错误处理函数,bad,fail,good,eof,clear,rdstate.,输出流,输出文件流成员函数(三)输出流的seekp和tellp函数输,38,二进制输出文件,(一),流的缺省输出模式是文本模式.以文本模式输出时,遇到10便自动扩充为回车换行符.而使用二进制模式输出时,所写的字符是不转换的.,使用二进制模式输出到文件的几种方法:,1.构造一个流,然后用,setmode,函数.,ofstream ofs(“test.dat”);,ofs.setmode(filebuf:binary);,2.使用,ofstream,构造函数中的模式参量.,3.使用二进制操作符代替,setmode,成员函数.,ofsopen(“filename”,iosmode);,在调用构造函数时指定文件名和模式,ifstream myFile(“filename”,iosmode);,输入流,构造输入流对象构造输入文件流的常用方法输入流,42,提取运算符和输入流操纵符,提取运算符()是从一个输入流对象获取字节的最容易方法.,用于格式化文本输入,提取数据时以空白符为分隔.,成员函数,getline,可以读一个含有空格的文本块,并对其进行分析.,前面介绍的输出错误处理函数,同样可应用于输入流.,实际上,只有,dec,oct,和,hex,等几个操纵符对输入流对象具有影响.,输入流,提取运算符和输入流操纵符提取运算符()是从一个输入流对象,43,输入文件流成员函数,(一),输入流成员函数用于从磁盘文件中输入.,输入流的,open,函数,若要用一个输入文件流,必须在构造函数或,open,函数中把该流与一个特定的磁盘文件关联起来.,输入流的,get,函数,功能与“”相像.但,get,函数在读入数据时包括空白字符,而“”在缺省时拒绝接受.,输入流,输入文件流成员函数(一)输入流成员函数用于从磁盘文件中输入.,44,#include,void main( ),char ch;,while (ch=cin.get()!=EOF),cout.put(ch);,运行时输入:,abc xyz 123,则输出:,abc xyz 123,注:先输入到一个缓冲区,再由,get,读入,,put,输出。,#include,45,输入文件流成员函数,(二),输入流的,get,line,函数,允许从输入流中读取多个字符,可以指定输入终止字符,读取完成后,从读取的内容中删除该终止字符.,输入流的,read,函数,从一个文件读字节到指定的存储器区域,所读字节数由长度参数确定.若没给长度参数,当遇到文件结束时读结束.,输入流,输入文件流成员函数(二)输入流的getline函数输入流,46,#include,void main( ),char ch;,while (ch=cin.get()!=EOF),cout.put(ch);,运行时输入:,abc xyz 123,则输出:,abc xyz 123,注:先输入到一个缓冲区,再由,get,读入,,put,输出。,#include,47,例 读入一串字符到,line,数组,以,t,终止,#,include ,void main(),char line100;,cout“Type a line terminated by t” endl;,cin.getline(line,100,t);,coutline;,例 读入一串字符到line数组,以t终止,48,例 从一个,payroll,文件读一个二进制记录到一个结构中,#include,#include,#include,void main( ),struct,double salary;,char name23;,employee;,例 从一个payroll文件读一个二进制记录到一个结构中,49,ifstream is (payroll,ios:binary |ios:nocreate);,if(is),is.read(char*),coutemployee.name employee.salaryendl;,else,coutERROR:Cannot open file payroll.endl;,ifstream is (payroll,ios:bi,50,输入文件流成员函数,(三),输入流的,seekg,和,tellg,函数,seekg,用来设置指向文件中下一次将读数据的位置的内部指针.,tellg,返回当前文件位置.,输入流的,close,函数,close,关闭与一个输入文件流关联的磁盘文件,输入流,输入文件流成员函数(三)输入流的seekg和tellg函数输,51,例 读一个文件并显示出其中空格的位置,#,include,void main( ), char ch;,ifstream tfile (payroll,ios:binary |ios:nocreate);,if(tfile), while (,tfile.good( ), streampos here=tfile.tellg( );,tfile.get(ch);,if(ch= ),coutnPositionhereis a space;,else, coutERROR:Cannot open file payrollch;/,从输入设备,(,串,),读入一个字符,coutchendl;/,输出,T,以串流为信息源:,56,例:将整数和浮点数放入串中,并取出来。,int inum1=93,inum2;,double fnum1=89.5,fnum2;,char *str=new char30;,ostrstream output(str,30);,output”,整数,:”inum”,符点数,:”fnum1endl;,output.close();,coutstrlen(str)inum2fnum2;,cout”,整数,:”inum2”,浮点数,:”fnum2endl;/,输出:整数:,93,浮点数:,89,。,5,delete str;,例:将整数和浮点数放入串中,并取出来。,57,C-与面向对象的程序设计-程序员联合开发网,58,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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