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

上传人:牧羊曲112 文档编号:6154088 上传时间:2023-09-30 格式:PPT 页数:62 大小:611.50KB
返回 下载 相关 举报
C+程序设计语言揣锦华第9章流类库与输入输出.ppt_第1页
第1页 / 共62页
C+程序设计语言揣锦华第9章流类库与输入输出.ppt_第2页
第2页 / 共62页
C+程序设计语言揣锦华第9章流类库与输入输出.ppt_第3页
第3页 / 共62页
C+程序设计语言揣锦华第9章流类库与输入输出.ppt_第4页
第4页 / 共62页
C+程序设计语言揣锦华第9章流类库与输入输出.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《C+程序设计语言揣锦华第9章流类库与输入输出.ppt》由会员分享,可在线阅读,更多相关《C+程序设计语言揣锦华第9章流类库与输入输出.ppt(62页珍藏版)》请在三一办公上搜索。

1、第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+程序中,数据可以从键盘流入到程序中,也可以从程序中流向屏幕或磁盘文件,把数据的流动抽象为“流”。流在使用前要被建立,使用后要被删除,还要使用一些特定的操作从流中获取数据

2、或向流中添加数据。从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。,流实际上就是一个字节序列。在输入操作中,字节从输入设备(如键盘、磁盘、网络连接等)流向内存;在输出操作中,字节从内存流向输出设备(如显示器、打印机、磁盘、网络连接等)。如图9-1所示。在C+语言中,针对流的特点,提供了如图9-2所示的层次结构来描述流的行为,并给出了I/O流类库的操作。,图9-2 输入/输出流类层次图,表9-1 I/O流类列表,9.1.2 输入/输出标准流类 1标准流的设备名 由表9-1可见,I/O流的标准头文件是iostream.h。其中,ostream类通过其派生类ostream_wit

3、hassign支持以下预先定义的流对象:cout:标准输出。默认设备为屏幕。cerr:标准错误输出。没有缓冲,发送给它的内容立即被输出,默认设备为屏幕。,clog:标准错误输出。有缓冲,当缓冲区满时被输出,默认设备为打印机。而istream类通过其派生类istream_withassign支持预先定义的对象。cin:标准输入。默认设备为键盘。,2原理 cout是ostream类的全局对象,它在头文件iostream.h中的定义如下:ostream cout(stdout);/这里,stdout作为该对象构造时的参数对应每种基本数据类型,ostream类都存在友元,它们都在iostream.h中

4、声明。例如:ostream/.,如语句:cout(int/.,9.2 文件流类,fstream、ifstream和ofstream是文件流类,在头文件fstream.h中定义。其中,fstream是ofstream和ifstream多重继承的子类。文件流类不是标准设备,没有cout那样预先定义的全局对象。文件流类支持对磁盘文件的操作。要定义一个文件流类对象,须指定文件名和打开方式。,类ofstream用于执行文件输出,该类有以下几个构造函数:ofstream:ofstream(filedesc fd);ofstream:ofstream(filedesc fd,char*pch,int nLe

5、ngth);ofstream:ofstream(const char*szName,int nMode=ios:out,int nProt=filebuf:openprot);,类ifstream用于执行文件输入,该类有以下几个构造函数:ifstream:ifstream(filedesc fd);ifstream:ifstream(filedesc fd,char*pch,int nLength);ifstream:ifstream(const char*szName,int nMode=ios:in,int nProt=filebuf:openprot);,其中最常用的都是最后一个构造函数

6、。该函数有三个参数,第一个参数是指向要打开的文件名的字符串,后两个参数指定文件的打开模式。文件打开模式的具体标志见表9-2。可以用按位OR(|)运算符组合这些标志,它们作为枚举器定义在ios类中。,表9-2 文件打开模式,打开一个输出文件,用于在文件尾添加数据 打开一个现存文件(用于输入或输出)并查找到结尾 打开一个输入文件。对于一个ofstream文件,使用ios:in作为一个openmode,可避免删除一个现存文件中现有的内容 打开一个文件,用于输出。对于所有ofstream对象,此模式是隐含指定的 如果一个文件存在,则打开它;否则该操作失败,如果一个文件不存在,则作为新文件打开它;如果文

7、件已存在,则该操作失败 打开一个文件。如果它已经存在,则删除其中原有的内容。如果指定了ios:out,但没有指定ios:ate、ios:app和ios:in,则隐含为此模式 以二进制模式打开一个文件(默认是文本模式)Nprot是文件保护方式,它的标志如表9-3。,表9-3 文件保护方式,【例9-1】向文件myfile中写入一些信息。#includevoid main()ofstream fc(c:tempmyfile);fcConstructs an ofstream object.nAll ofstream constructors construct a filebuf object.n;

8、,注意:这里的文件名要说明其路径,要使用双斜杠,因为C+编译器理解单斜杠为字符转换符。在文件打开时,匹配了构造函数ofstream:ofstream(char*),只需要一个文件名,其它为默认。打开方式默认为ios:out|ios:trunc,即该文件用于接受程序的输出。如果该文件已存在,则其内容必须先清除,否则就新建。,如果要检查文件是否打开,则须判断成员函数fail():#include void func()ofstream fc(myfile);if(fc.fail()/fail()=1 cerrerror opening filen;return;fc.;,若要打开一个输入文件,则有

9、/.ifstream fc(myfile,ios:nocreate);/.当然,也可以通过检查fc.fail()来确定文件打开是否出错。如果要打开一个同时用于输入和输出的文件,则有/.fstream fc(myfile,ios:in|ios:out);/.,9.3 串流类,strstream、istrstream和ostrstream是串流类,在头文件strstrea.h中定义。其中,strstream是istrstream和ostrstream多重继承的子类。同样,串流类也不是标准设备,它没有cout那样预先定义的全局对象。串流类允许将fstream类定义的文件操作应用于存储区中的字符串,即

10、将字符串看作为设备。要定义一个串流类对象,须提供字符数组和数组大小。,类ostrstream用于执行串流输出,该类有以下几个构造函数:ostrstream();ostrstream(char*pch,int nLength,int nMode=ios:out);其中比较常用的是第二个构造函数,它有三个参数。第一个参数指出字符数组,第二个参数说明数组的大小,第三个参数指出打开方式。,类istrstream用于执行串流输入,该类有以下几个构造函数:istrstream(char*pch);istrstream(char*pch,int nLength);这两个构造函数都比较常用。Char*pch参

11、数指出了字符数组,int nLength参数说明数组的大小。当nLength为0时,表示把istrstream类对象连接到由pch指向的以空字符结束的字符串。,例如,下面的程序代码定义一个串流类对象,并对其进行输入操作:char str50=How are you!n;char a;istrstream ss(str);ssa;coutaendl;输出结果为 H,【例9-2】使用串流输入对字符串中的数据进行解读。#include#includechar*ioString(char*);void main()char*str=100 123.456;char*Buf0=ioString(str)

12、;coutBuf0endl;,char*ioString(char*pString)istrstream inS(pString,0);/以ios:in方式int iNumber;float fNumber;inSiNumberfNumber;/从串流中读入一个整数和浮点数char*Buf1=new char28;ostrstream outS(Buf1,28);outSiNumber=iNumber,fNumber=fNumberendl;return Buf1;,程序运行结果为 iNumber=100,fNumber=123.456 分析:在函数ioString()中,以pString为输

13、入设备,先定义一个输入串流对象inS,从中输入一个整数和一个浮点数。再开辟一个字符串空间作为输出设备,定义一个输出串流对象outS,将从输入设备输入的两个变量的值输出。,9.4 控制符,9.4.1 使用流对象的成员函数【例9-3】使用width成员函数控制输出宽度。#include void main()double values=1.44,36.47,625.7,4096.24;for(int i=0;i4;i+),cout.width(10);coutvaluesin;程序运行结果为 1.4436.47625.74096.24,此例子在一列中以至少10个字符宽按右对齐方式输出数据。从程序的

14、输出结果可以看到,在少于10个字符宽的数值前加入了引导空格。空格是默认的填充符,当输出的数据不能充满指定的宽度时,系统会自动以空格填充。另外,还可以使用fill成员函数为已经指定宽度的域设置填充字符的值。为了用星号填充数值列,我们可以将例9-3中的for循环修改如下:,for(int i=0;i4;i+)cout.width(10);cout.fill(*);coutvaluesiendl;其输出结果为*1.44*36.47*625.7*4096.24,9.4.2 使用控制符 C+的输入/输出流类库提供了一些控制符,可以直接嵌入到输入/输出语句中来实现对I/O格式的控制。它的优点是程序可以直接

15、将控制符插入流中,而不必单独调用。表9-4中列出了常用的I/O流类库控制符。,表9-4 常用的I/O流类库控制符,【例9-4】使用setw控制符指定宽度。#include#includevoid main()double values=1.44,36.47,625.7,4096.24;char*names=Rose,John,Alice,Mary;for(int i=0;i4;i+),coutsetw(6)namesisetw(10)valuesiendl;width成员函数在头文件iostream.h中说明。如果带参量使用setw(n)或任何其它控制符,还必须包括头文件iomanip.h。在

16、输出中,字符串输出在宽度为6的域中,整数输出在宽度为10的域中。程序运行结果为 Rose 1.44 John 36.47 Alice 625.7 Mary 4096.24,setw和width都不截断数值。如果一个数值需要比set(n)确定的字符数更多的字符,则该值将使用它所需要的所有字符。当然,还要遵守该流的精度设置。setw和width仅影响紧随其后的域,即使用setw和width设置的间隔方式并不保留其效力。在一个域输出完后,域宽度恢复成它的默认值(必要的宽度),但其它流格式选项保持有效直到发生改变。,例如,下面的程序代码:/.cout setiosflags(ios:right)/设置

17、为默认的右对齐方式,setw(5)1setw(5)2setw(5)3endl;cout setiosflags(ios:left)/设置成左对齐方式,setw(5)1 setw(5)2 setw(5)3endl;coutresetiosflags(ios:left)/关闭左对齐标志/.这段程序代码中,是通过使用带参数的setiosflags控制符来设置左、右对齐,参数是ios:left和ios:right枚举器。,该枚举器定义在ios类中,因此,引用时必须包括ios:前缀。这里需要用resctiosflags操纵符关闭左、右对齐标志。setiosflags不同于width和setw,它的影响是

18、持久的,直到用resetiosflags重新恢复默认值时为止。这段程序代码的输出结果为 1 2 3 1 2 3 常用控制符和流格式控制成员函数如表9-5所示。,表9-5 常用控制符和流成员函数,9.5 输入/输出成员函数,9.5.1 使用成员函数输入 1getline()函数 在程序使用cin输入时,cin用空白符和行结束符将各个值分开。有时候输入可能需要读取一整行文本并且分开不同的域,为此,我们可以使用getline成员函数。其函数原型如下:istream,其中,第一个参数是字符数组,用于放置读取的文本;第二个参数是本次读取的最大字符个数;第三个参数是分隔字符,作为读取一行结束的标志。get

19、line成员函数的功能是允许从输入流中读取多个字符(包括空白字符和行结束符),并且允许指定输入终止字符(默认值是换行字符)。在读取完成后,从读取的内容中删除该终止字符。,【例9-5】为输入流指定一个终止字符。本程序连续读入一串字符,直到遇到字符t时停止,字符个数最多不超过99个。程序中的t是大小写敏感的。#include void main()char line100;coutType a line terminated by tendl;cin.getline(line,100,t);coutlineendl;,2get()函数 在输入时,有些时候需要执行每次只输入单个字符的操作,我们可以使

20、用get()成员函数来完成。get()函数的格式如下:char istream:get();【例9-6】循环读入字符,直到键入一个y字符,或遇到文件尾。#include void main()char letter;while(!cin.eof(),letter=cin.get();if(letter=y)coutybe met!;break;coutletter;,get()函数还有一种形式可以输入一系列字符,直到输入流中出现结束符或所读字符个数已达到要求读的字符个数。这时,get()函数的函数原型如下:istream,例如,下面程序输入一系列字符,将前24个字符输出。#include vo

21、id main()char line25;cout;cin.get(line,25);cout line;,9.5.2 使用成员函数输出【例9-7】使用put()成员函数,在屏幕上显示字母表中的字母。#include void main()char letter;for(letter=A;letter=Z;letter+)cout.put(letter);,程序运行结果为ABCDEFGHIJKMNOPQRSTUVWXYZ也可以像下面那样在一条语句中连续调用put()函数:cout.put(A).put(n);该语句在输出字符A后输出一个新换行符。还可以用ASCII码值表达式调用put()函数:

22、cout.put(65);该语句也输出字符A。,9.6 用户自定义类型的输入/输出,【例9-8】用户自定义的插入运算符和提取运算符。#include class PhoneNumber private:char nationCode4;char areaCode4;char phoneCode8;,public:friend ostream,istream,void main()PhoneNumber phone;coutphone;coutThe phone number entered was:nphoneendl;,程序运行结果为 输入:(086)029-1234567 The phon

23、e number entered was:(086)029-1234567 该程序为处理用户自定义的电话号码类PhoneNumber的数据重载了这两个运算符。另外,该程序假定电话号码的输入是正确的。,提取运算符的参数是对istream对象的引用和对自定义类型对象的引用,返回对istream对象的引用。在该程序中,重载的提取运算符用于把形如(086)029-5261111的电话号码输入到PhoneNumber类型的对象中。运算符函数分别将电话号码的三个部分分别读到被引用的PhoneNumber对象的成员nationCode、areaCode和phoneCode中(在运算符函数中,被引用对象是nu

24、m;在main函数中,被引用对象是phone)。,调用成员函数ignore()去掉了括号和破折号。运算符函数返回istream,插入运算符的两个参数是对ostream对象的引用和对自定义类型(本例中为PhoneNumber)的对象的引用,返回对ostream对象的引用。在该程序中,重载的插入运算符按输入格式显示类PhoneNumber的对象。该运算符函数将电话号码各部分显示为字符串,因为它们是以字符串格式存储的(类istream中的成员函数getline在结束输入后存储一个空字符)。,重载的运算符函数在类PhoneNumber中被声明为友元函数。为了能够访问类中非公有成员,重载的输入和输出运算符必须被声明为类的友元。C+允许为用户自定义类型增加新的输入/输出能力,而无需修改类ostream或istream中的声明和私有数据成员。这大大提高了C+的可扩展性。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号