C程序设计语言揣锦华第9章流类库与输入输出.ppt

上传人:max****ui 文档编号:11548942 上传时间:2020-04-28 格式:PPT 页数:62 大小:649KB
返回 下载 相关 举报
C程序设计语言揣锦华第9章流类库与输入输出.ppt_第1页
第1页 / 共62页
C程序设计语言揣锦华第9章流类库与输入输出.ppt_第2页
第2页 / 共62页
C程序设计语言揣锦华第9章流类库与输入输出.ppt_第3页
第3页 / 共62页
点击查看更多>>
资源描述
第9章流类库与输入/输出,9.1输入/输出标准流类9.2文件流类9.3串流类9.4控制符,9.1输入/输出标准流类,9.1.1输入/输出流的概念就像C语言一样,C+语言中也没有输入/输出语句。C+的I/O是以字节流的形式实现的,每一个C+编译系统都带有一个面向对象的输入/输出软件包,这就是I/O流类库。其中,流是I/O流类的中心概念。到目前为止,我们一直在使用它。,所谓流,是指数据从一个对象流向另一个对象。在C+程序中,数据可以从键盘流入到程序中,也可以从程序中流向屏幕或磁盘文件,把数据的流动抽象为“流”。流在使用前要被建立,使用后要被删除,还要使用一些特定的操作从流中获取数据或向流中添加数据。从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。,流实际上就是一个字节序列。在输入操作中,字节从输入设备(如键盘、磁盘、网络连接等)流向内存;在输出操作中,字节从内存流向输出设备(如显示器、打印机、磁盘、网络连接等)。如图9-1所示。在C+语言中,针对流的特点,提供了如图9-2所示的层次结构来描述流的行为,并给出了I/O流类库的操作。,图9-2输入/输出流类层次图,表9-1I/O流类列表,9.1.2输入/输出标准流类1标准流的设备名由表9-1可见,I/O流的标准头文件是iostream.h。其中,ostream类通过其派生类ostream_withassign支持以下预先定义的流对象:cout:标准输出。默认设备为屏幕。cerr:标准错误输出。没有缓冲,发送给它的内容立即被输出,默认设备为屏幕。,clog:标准错误输出。有缓冲,当缓冲区满时被输出,默认设备为打印机。而istream类通过其派生类istream_withassign支持预先定义的对象。cin:标准输入。默认设备为键盘。,2原理cout是ostream类的全局对象,它在头文件iostream.h中的定义如下:ostreamcout(stdout);/这里,stdout作为该对象构造时的参数对应每种基本数据类型,ostream类都存在友元,它们都在iostream.h中声明。例如:ostream/.,如语句:cout(int/.,9.2文件流类,fstream、ifstream和ofstream是文件流类,在头文件fstream.h中定义。其中,fstream是ofstream和ifstream多重继承的子类。文件流类不是标准设备,没有cout那样预先定义的全局对象。文件流类支持对磁盘文件的操作。要定义一个文件流类对象,须指定文件名和打开方式。,类ofstream用于执行文件输出,该类有以下几个构造函数:ofstream:ofstream(filedescfd);ofstream:ofstream(filedescfd,char*pch,intnLength);ofstream:ofstream(constchar*szName,intnMode=ios:out,intnProt=filebuf:openprot);,类ifstream用于执行文件输入,该类有以下几个构造函数:ifstream:ifstream(filedescfd);ifstream:ifstream(filedescfd,char*pch,intnLength);ifstream:ifstream(constchar*szName,intnMode=ios:in,intnProt=filebuf:openprot);,其中最常用的都是最后一个构造函数。该函数有三个参数,第一个参数是指向要打开的文件名的字符串,后两个参数指定文件的打开模式。文件打开模式的具体标志见表9-2。可以用按位OR(|)运算符组合这些标志,它们作为枚举器定义在ios类中。,表9-2文件打开模式,打开一个输出文件,用于在文件尾添加数据打开一个现存文件(用于输入或输出)并查找到结尾打开一个输入文件。对于一个ofstream文件,使用ios:in作为一个openmode,可避免删除一个现存文件中现有的内容打开一个文件,用于输出。对于所有ofstream对象,此模式是隐含指定的如果一个文件存在,则打开它;否则该操作失败,如果一个文件不存在,则作为新文件打开它;如果文件已存在,则该操作失败打开一个文件。如果它已经存在,则删除其中原有的内容。如果指定了ios:out,但没有指定ios:ate、ios:app和ios:in,则隐含为此模式以二进制模式打开一个文件(默认是文本模式)Nprot是文件保护方式,它的标志如表9-3。,表9-3文件保护方式,【例9-1】向文件myfile中写入一些信息。#includevoidmain()ofstreamfc(c:tempmyfile);fcConstructsanofstreamobject.nAllofstreamconstructorsconstructafilebufobject.n;,注意:这里的文件名要说明其路径,要使用双斜杠,因为C+编译器理解单斜杠为字符转换符。在文件打开时,匹配了构造函数ofstream:ofstream(char*),只需要一个文件名,其它为默认。打开方式默认为ios:out|ios:trunc,即该文件用于接受程序的输出。如果该文件已存在,则其内容必须先清除,否则就新建。,如果要检查文件是否打开,则须判断成员函数fail():#includevoidfunc()ofstreamfc(myfile);if(fc.fail()/fail()=1cerrerroropeningfilen;return;fca;coutaendl;输出结果为H,【例9-2】使用串流输入对字符串中的数据进行解读。#include#includechar*ioString(char*);voidmain()char*str=100123.456;char*Buf0=ioString(str);coutBuf0iNumberfNumber;/从串流中读入一个整数和浮点数char*Buf1=newchar28;ostrstreamoutS(Buf1,28);outSiNumber=iNumber,fNumber=fNumberendl;returnBuf1;,程序运行结果为iNumber=100,fNumber=123.456分析:在函数ioString()中,以pString为输入设备,先定义一个输入串流对象inS,从中输入一个整数和一个浮点数。再开辟一个字符串空间作为输出设备,定义一个输出串流对象outS,将从输入设备输入的两个变量的值输出。,9.4控制符,9.4.1使用流对象的成员函数【例9-3】使用width成员函数控制输出宽度。#includevoidmain()doublevalues=1.44,36.47,625.7,4096.24;for(inti=0;i4;i+),cout.width(10);coutvaluesin;程序运行结果为1.4436.47625.74096.24,此例子在一列中以至少10个字符宽按右对齐方式输出数据。从程序的输出结果可以看到,在少于10个字符宽的数值前加入了引导空格。空格是默认的填充符,当输出的数据不能充满指定的宽度时,系统会自动以空格填充。另外,还可以使用fill成员函数为已经指定宽度的域设置填充字符的值。为了用星号填充数值列,我们可以将例9-3中的for循环修改如下:,for(inti=0;i4;i+)cout.width(10);cout.fill(*);coutvaluesiendl;其输出结果为*1.44*36.47*625.7*4096.24,9.4.2使用控制符C+的输入/输出流类库提供了一些控制符,可以直接嵌入到输入/输出语句中来实现对I/O格式的控制。它的优点是程序可以直接将控制符插入流中,而不必单独调用。表9-4中列出了常用的I/O流类库控制符。,表9-4常用的I/O流类库控制符,【例9-4】使用setw控制符指定宽度。#include#includevoidmain()doublevalues=1.44,36.47,625.7,4096.24;char*names=Rose,John,Alice,Mary;for(inti=0;i4;i+),coutsetw(6)namesisetw(10)valuesiendl;width成员函数在头文件iostream.h中说明。如果带参量使用setw(n)或任何其它控制符,还必须包括头文件iomanip.h。在输出中,字符串输出在宽度为6的域中,整数输出在宽度为10的域中。程序运行结果为Rose1.44John36.47Alice625.7Mary4096.24,setw和width都不截断数值。如果一个数值需要比set(n)确定的字符数更多的字符,则该值将使用它所需要的所有字符。当然,还要遵守该流的精度设置。setw和width仅影响紧随其后的域,即使用setw和width设置的间隔方式并不保留其效力。在一个域输出完后,域宽度恢复成它的默认值(必要的宽度),但其它流格式选项保持有效直到发生改变。,例如,下面的程序代码:/.coutsetiosflags(ios:right)/设置为默认的右对齐方式,setw(5)1setw(5)2setw(5)3endl;coutsetiosflags(ios:left)/设置成左对齐方式,setw(5)1setw(5)2setw(5)3endl;coutresetiosflags(ios:left)/关闭左对齐标志/.这段程序代码中,是通过使用带参数的setiosflags控制符来设置左、右对齐,参数是ios:left和ios:right枚举器。,该枚举器定义在ios类中,因此,引用时必须包括ios:前缀。这里需要用resctiosflags操纵符关闭左、右对齐标志。setiosflags不同于width和setw,它的影响是持久的,直到用resetiosflags重新恢复默认值时为止。这段程序代码的输出结果为123123常用控制符和流格式控制成员函数如表9-5所示。,表9-5常用控制符和流成员函数,9.5输入/输出成员函数,9.5.1使用成员函数输入1getline()函数在程序使用cin输入时,cin用空白符和行结束符将各个值分开。有时候输入可能需要读取一整行文本并且分开不同的域,为此,我们可以使用getline成员函数。其函数原型如下:istream,其中,第一个参数是字符数组,用于放置读取的文本;第二个参数是本次读取的最大字符个数;第三个参数是分隔字符,作为读取一行结束的标志。getline成员函数的功能是允许从输入流中读取多个字符(包括空白字符和行结束符),并且允许指定输入终止字符(默认值是换行字符)。在读取完成后,从读取的内容中删除该终止字符。,【例9-5】为输入流指定一个终止字符。本程序连续读入一串字符,直到遇到字符t时停止,字符个数最多不超过99个。程序中的t是大小写敏感的。#includevoidmain()charline100;coutTypealineterminatedbytendl;cin.getline(line,100,t);coutlineendl;,2get()函数在输入时,有些时候需要执行每次只输入单个字符的操作,我们可以使用get()成员函数来完成。get()函数的格式如下:charistream:get();【例9-6】循环读入字符,直到键入一个y字符,或遇到文件尾。#includevoidmain()charletter;while(!cin.eof(),letter=cin.get();if(letter=y)coutybemet!;break;coutletter;,get()函数还有一种形式可以输入一系列字符,直到输入流中出现结束符或所读字符个数已达到要求读的字符个数。这时,get()函数的函数原型如下:istream,例如,下面程序输入一系列字符,将前24个字符输出。#includevoidmain()charline25;cout;cin.get(line,25);coutline;,9.5.2使用成员函数输出【例9-7】使用put()成员函数,在屏幕上显示字母表中的字母。#includevoidmain()charletter;for(letter=A;letterphone;coutThephonenumberenteredwas:nphoneendl;,程序运行结果为输入:(086)029-1234567Thephonenumberenteredwas:(086)029-1234567该程序为处理用户自定义的电话号码类PhoneNumber的数据重载了这两个运算符。另外,该程序假定电话号码的输入是正确的。,提取运算符的参数是对istream对象的引用和对自定义类型对象的引用,返回对istream对象的引用。在该程序中,重载的提取运算符用于把形如(086)029-5261111的电话号码输入到PhoneNumber类型的对象中。运算符函数分别将电话号码的三个部分分别读到被引用的PhoneNumber对象的成员nationCode、areaCode和phoneCode中(在运算符函数中,被引用对象是num;在main函数中,被引用对象是phone)。,调用成员函数ignore()去掉了括号和破折号。运算符函数返回istream,插入运算符的两个参数是对ostream对象的引用和对自定义类型(本例中为PhoneNumber)的对象的引用,返回对ostream对象的引用。在该程序中,重载的插入运算符按输入格式显示类PhoneNumber的对象。该运算符函数将电话号码各部分显示为字符串,因为它们是以字符串格式存储的(类istream中的成员函数getline在结束输入后存储一个空字符)。,重载的运算符函数在类PhoneNumber中被声明为友元函数。为了能够访问类中非公有成员,重载的输入和输出运算符必须被声明为类的友元。C+允许为用户自定义类型增加新的输入/输出能力,而无需修改类ostream或istream中的声明和私有数据成员。这大大提高了C+的可扩展性。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


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

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


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