C程序设计第11章C的IO流类.ppt

上传人:牧羊曲112 文档编号:6503637 上传时间:2023-11-07 格式:PPT 页数:66 大小:249.50KB
返回 下载 相关 举报
C程序设计第11章C的IO流类.ppt_第1页
第1页 / 共66页
C程序设计第11章C的IO流类.ppt_第2页
第2页 / 共66页
C程序设计第11章C的IO流类.ppt_第3页
第3页 / 共66页
C程序设计第11章C的IO流类.ppt_第4页
第4页 / 共66页
C程序设计第11章C的IO流类.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《C程序设计第11章C的IO流类.ppt》由会员分享,可在线阅读,更多相关《C程序设计第11章C的IO流类.ppt(66页珍藏版)》请在三一办公上搜索。

1、第11章 C+的IO流库,2008-2009-2,2,本章内容提要,流概述、屏幕输出、键盘输入格式化输入和输出磁盘文件的输入和输出字符串流、流错误的处理,2008-2009-2,3,流的概念,用于输入输出地一组类。流有两种类型:文本流、二进制流。输出流与输入流。说明:“流”看成一个逻辑设备。“流”是临时的。提取操作和插入操作。,2008-2009-2,4,文件和缓存的概念,文件是对具体设备的抽象。如,磁盘文件和显示器都是文件。所有流的行为对程序员来讲都是相同的。说明:流统一了对相关文件的操作。缓冲缓冲区是指系统在内存中开辟的一块区域临时存放信息.缓冲流:缓冲区满或当前输入流中有新的行符时,系统

2、才对流进行刷新。非缓冲流:所有输入流中的数据将被外部设备立即处理。,2008-2009-2,5,流与文件、缓冲的关系,示意图,内存,(程序),显示器键盘磁盘等等设备,(文件),(流),插入,提取,缓冲流,2008-2009-2,6,C+流类的基本结构,iostream.h,流类的继承体系,ios,虚基类,提供一些关于对流状态进行设置的功能,有一个指向streambuf类的指针,管理一个流的缓冲区。为它的派生类提供缓冲支持。,提供从流中提取数据的操作的成员函数,提供从流中插入数据的操作成员函数,综合ostream和istream类的行为,支持对一个流同时进行输入输出操作,文件的打开和关闭是通过f

3、stream类的成员函数open和close来实现的,2008-2009-2,7,一、标准输出,C+中有4个预定义的流对象,2008-2009-2,8,一、标准输出,标准输出主要有三种形式:预定义的插入符利用cout的put()成员函数利用cout的write()成员函数,2008-2009-2,9,1.预定义的插入符,“);例如:coutabcd;,2008-2009-2,10,例11.1:,问题:分析程序结果。,#includevoid main()int a=100;int*pa=,程序运行结果为:&pa=0 x0013FF78&pa=1310584,2008-2009-2,11,例11

4、.2:,问题:分析程序结果。,#include void main()int i=2,j=9;coutj)?i:jendl;,程序运行结果为:error C2297:illegal,right operand has type class ostream&(_cdecl*)(class ostream&),#include void main()int i=2,j=9;coutj)?i:j)endl;,2008-2009-2,12,2.put()成员函数,屏幕输出的第二种方法可以由成员函数put()实现。使用成员函数put()写一个字符。成员函数put()是将字符送进输出流格式:cout.pu

5、t(char c);或cout.put(const char c);,2008-2009-2,13,例11.3:,问题:分析程序结果。,#include void main()couta,bn;/输出常量cout.put(a).put(,).put(b).put(n);char c1=A,c2=B;cout.put(c1).put(c2).put(n);/输出变量,程序运行结果为:a,ba,bAB,2008-2009-2,14,3.write()成员函数,成员函数write()也可实现屏幕的输出。使用成员函数write()输出一个字符串。格式:cout.write(const char*str

6、,int n)说明:str是一个字符指针或字符数组,用来存放一个字符串的,n是一个int型数,表示输出显示字符串中字符的个数。,2008-2009-2,15,例11.4:,问题:分析程序结果。,#include#includevoid PrintString(char*s)cout.write(s,strlen(s).put(n);cout.write(s,7)n;void main()char str=I love China;coutthe string is:strendl;PrintString(str);PrintString(this is a string);,程序运行结果为:t

7、he string is:I love ChinaI love ChinaI lovethis is a stringthis is,2008-2009-2,16,二、标准输入,标准输入主要有三种形式:预定义的符提取符利用cout的get()成员函数利用cout的read()成员函数,2008-2009-2,17,1.预定义的提取符,预定义的提取符()最一般的键盘输入是将提取符作用在流类的对象cin上。cin重载格式:istream 使用格式:cin说明:从键盘上输入的两个数之间常用空白符、tab、或换行符作为分隔符。,2008-2009-2,18,例11.5:,问题:提取符的应用。,#inc

8、lude#includevoid main()const int SIZE=80;char bufSIZE;char*largest;int curLen,maxLen=-1,cnt=0;coutbuf)/输入单词以空白分隔,以ctrl+z结束。curLen=strlen(buf);cnt+;if(curLenmaxLen)maxLen=curLen;largest=buf;coutendl;cout单词个数:cntendl;cout最长的单词长度:maxLenendl;cout最后一个单词:largestendl;,程序运行结果为:Input words:extractor example.

9、Z单词个数:2最长的单词长度:9最后一个单词:example.,2008-2009-2,19,提取符使用注意事项:,提取符可从输入流中读取一个字符序列。并认为这个字符串是以空白符为结束的字符序列。每读入一个字符串时,系统自动加上0字符。使用ctrl+z作为输入流的结束符。具体操作中,先输入换行符后,再输入ctrl+z键。此时cinbuf的值为0,则退出循环。,2008-2009-2,20,2.get()成员函数,使用get()读一个字符格式:cin.get()如例9-9格式:cin.get(char 如例9-10注意:该函数从输入流中获取字符时,不忽略空白符。,2008-2009-2,21,例

10、11.6:,问题:分析程序输出结果。,#include void main()char ch;int i=0;coutinput:;while(ch=cin.get()!=EOF)cout.put(ch);i+;coutok!endl;couti=i;,程序运行结果为:input:abcdefghijklmnabcdefghijklmnZok!i=15,2008-2009-2,22,get()使用注意事项:,get()从输入流返回一个字符的ASCII码值,可以赋给一个int型量。EOF是一个符号常量,它的值是-1,被包含在iostream.h文件中。put(ch)只能对char型量操作。与ge

11、t()不同。,2008-2009-2,23,例11.7:,问题:编程统计从键盘上输入每一行字符的个数,从中选取出最短的行的字符个数,统计共输入多少行。,#include const int SIZE=80;void main()int lcnt=0,lmin=32767;char bufSIZE;coutinput.n;while(cin.getline(buf,SIZE)int count=cin.gcount();lcnt+;if(countlmin)lmin=count;coutLine#lcntt“;coutchars read:countendl;cout.write(buf,cou

12、nt).put(n).put(n);coutendl;coutTotal line:lcntendl;coutshortest line:lminendl;,程序运行结果为:input.oneLine#1 chars read:4one,2008-2009-2,24,3.read()成员函数,成员函数read()可以从输入流中读取指定数目的字符并将它们存入在指定的数组中。格式:cin.read(char*buf,int size)说明:buf:存放读取的字符的指针或字符数组。size:指定从输入流中读取字符的个数。也可以使用gcount()统计上一次使用read()函数读取的字符个数。使用pe

13、ek()函数,返回字符但不提取。,2008-2009-2,25,例11.8:,问题:编程统计从键盘上输入每一行字符的个数,从中选取出最短的行的字符个数,统计共输入多少行。,#include void main()const int S=80;char bufS=;coutinput.n;cin.read(buf,S);coutchars read:cin.gcount()endl;coutbufendl;,程序运行结果为:input.this is a c+program.Zchars read:23this is a c+program.,2008-2009-2,26,例11.9:,问题:分

14、析程序输出结果。,#include void main()int ch,cnt=0;coutinput.n;while(ch=cin.get()!=EOF)if(ch=i,程序运行结果为:input.this is a c+program.Z2,2008-2009-2,27,四、格式控制I/O操作,格式化输入与输出是指按规定的格式对流进行输入与输出操作。在没有特意进行格式控制的情况下,输入输出采用默认格式。两种方式控制数据的格式:使用成员函数设置标志位使用成员函数直接设置格式使用操作子,2008-2009-2,28,默认的输入输出格式,默认的输入格式 short、int、long(signed

15、、unsigned):与整型常量相同float、double、long double:与浮点数常量相同char(signed、unsigned):第一个非空白字符char*(signed、unsigned):从第一个非空白字符开始到下一个空白字符结束void*:无前缀的16进制数bool:把true或1识别为true,其他的均识别为false,例如,执行int a,b;char c;char d20;cinabcd;若输入:123 456abcde efg则a的值为123,b的值为456,c的值为a,d的值为bcde。,2008-2009-2,29,默认的输入输出格式,默认的输出格式 shor

16、t、int、long(signed、unsigned):一般整数形式,负数前有-号float、double、long double:浮点格式或指数格式(科学表示法),取决于哪个更短char(signed、unsigned):单个字符(无引号)char*(signed、unsigned):字符序列(无引号)void*:无前缀的16进制数bool:1或0,例如,执行char c=A,*p=Hello!;cout123c-123endl;coutp(void*)p;将输出:123A-123Hello!0041B18C,2008-2009-2,30,1.流的格式化标志,控制格式的标志位(如表11.1)

17、ios类中的保护成员,长整数x_flags,表示流的当前数据格式控制状态,称为格式化标志字(formatting flag)保护成员x_flags必须通过成员函数来访问。使用成员函数设置标志字long flags(long)long setf(long setbits,long field)unsetf(long)在ios类中,还定义了下面的静态类对象:static const long basefield;其值为del|oct|hex,2008-2009-2,31,表11.1 ios标志位,2008-2009-2,32,例11.10:,问题:标志位设置的例子。,#include void m

18、ain()/清除dec,hex,设置8进制 cout.setf(ios:oct,ios:basefield);cout254endl;,程序运行结果为:OCT:56-70DEC:56-70HEX:56-38HEX:32-0 x20HEX:254-0XFE,2008-2009-2,33,设置标志字举例说明,setf格式:long ios:setf(long_bits);例:cout.setf(ios:hex|ios:left);按十六进制输出,左对齐unsetf格式:long ios:unsetf(long_bits);清除long_bits相应的标志格式字直接读写函数flags()long i

19、os:flags()long ios:flags(long_xflags)注意:cout.setf(ios:hex);/16进制输出cout.flags(ios:hex);/16进制输出,并将其他标志清零,2008-2009-2,34,2.直接使用格式化输出函数,输出宽度控制函数width()int ios:width();int ios:width(int w);注意:仅对下一个输出项有效输出精度控制函数precision()int ios:precision();int ios:priecision(int p);注意:默认值为6位,2008-2009-2,35,注意几点:,数据输出宽度在

20、缺省情况下为表示数据所需的最少字符数。缺省的填充字符为空格符。如果所设置的数据宽度小于数据所需的最少字符数时,则数据宽度按缺省宽度处理。float型实数最多提供7位有效数字,double型实数最多提供15位有效数字,long double型实数最多提供19位有效数字。,2008-2009-2,36,3.操作子,操作子是一个对象,它们可以直接被插入符或提取符操作。表9-2列出了流类库定义的操作子操作子举例:couthex100;coutsetw(6)test;couti;clogiflush;例9-17 使用操作子,2008-2009-2,37,表11.2 操作子,2008-2009-2,38,

21、例11.11:,问题:分析程序输出结果。,#include#include void main()int i=1234;coutiendl;coutsetw(12)iendl;coutresetiosflags(ios:right);coutsetiosflags(ios:left)setfill(*);coutsetw(12)iendl;coutwidth:cout.width()endl;,程序运行结果为:1234 12341234*width:0,2008-2009-2,39,例11.12:,问题:分析程序输出结果。,#include#include#include using name

22、space std;int main()int i;cout|;for(i=0;i10;i+)coutsetw(5)i;coutendl-+;for(i=0;i10;i+)cout-;coutfixedsetprecision(3);for(i=0;i10;i+)coutendlsetw(2)i|;for(int j=0;j10;j+)coutsetw(7)sqrt(i*10+j);coutendl;return 0;,2008-2009-2,40,四、插入符和提取符的重载,根据需要,用户可对插入符()进行重载来支持新的数据类型的输出和输入。C+流的输入运算符“”和输出运算符“”或“(istr

23、eam,2008-2009-2,41,例11.13:,问题:分析程序输出结果。,#include class Datepublic:Date(int y,int m,int d)Year=y;Month=m;Day=d;friend ostream,istream,void main()Date CDate(2008,8,8);coutCDate;coutNew date:CDateendl;,程序运行结果为:Current date:2008/8/8Enter new date:2008 11 30New date:2008/11/30,2008-2009-2,42,五、字符串流,C+的I/

24、O流库中提供了两个类:ostrstreamistrtream说明:它们都包含在strstrea.h文件中。利用这两个类可以实现将一个字符串内的数字字符转换成二进制形式存放在某种类型的对象中,或者将一个二进制数转换成字符存储在一个字符数组对象中。,2008-2009-2,43,1.ostrsteam类的构造函数,ostrstream类的构造函数有两种原型。ostrstream:ostrstream();说明:这是缺省构造函数,用来建立存储所插入的数据的数组对象。ostrstream:ostrstream(char*s,int n,int mode=ios:out);说明:函数中有三个参数。s指所

25、插入的字符指针或字符数组;n是指定这个数组最多能存放的字符个数;mode给出了流的方式,缺省为out,还可以选用ate和app方式。注意:ostrstream在进行插入操作时,并不在输出流中的末尾自动添加空字符,需要在程序中显式地添加这个空字符。,2008-2009-2,44,例11.14:,问题:分析程序输出结果。,#include#include#includeconst int N=80;void main()char bufN;/创建一个流对象,将流向一个字符数组buf ostrstream out1(buf,sizeof(buf);int a=80;for(int i=0;i5;i+

26、,a+=10)/将a=和int型数和;,通过out1插入到buf中 out1a=a;out10;coutbuf:bufendl;,程序运行结果为:buf:a=80;a=90;a=100;a=110;a=120;,2008-2009-2,45,2.istrstream类的构造函数,istrstream类的构造函数有两种原型。istrstream:istrstream();说明:这个构造函数使用所指定串的全部内容来构造流对象。istrstream:istrstream(char*s,int n);说明:这个构造函数使用所指定串的前n个字符来构造流对象。,2008-2009-2,46,例11.14:

27、,问题:分析程序输出结果。,#include#includevoid main()char buf=123 45.67;int a;double b;istrstream ss(buf);/通过ss流提取buf中的123给a,45.67给b ssab;couta+bendl;,程序运行结果为:168.67,2008-2009-2,47,六、磁盘文件的输入和输出,对文件的操作是由文件流类完成的。文件流类在流与文件之间建立连接。文件流分为:输入流、输出流、输入/输出流磁盘文件一般分为:文本文件、二进制文件和随机文件对磁盘文件流的基本操作:定义流对象、打开、读写操作、关闭,2008-2009-2,4

28、8,文件流类定义文件流类对象方法:文件流类 对象名;例如:ifstream ifile;/定义一个文件输入流对象ofstream ofile;/定义一个文件输出流对象fstream iofile;/定义一个文件输入输出流对象,1.磁盘文件的打开和关闭,2008-2009-2,49,文件的打开利用文件流对象的成员函数open()void open(char*filename,int mode,int access=filebuf:openprot);说明:filename:指定要打开的文件名mode:指定了文件的打开方式access:指定文件系统属性,1.磁盘文件的打开和关闭,0一般文件1只读文

29、件2隐藏文件3系统文件,2008-2009-2,50,表11.3 文件访问方式常量,2008-2009-2,51,1.磁盘文件的打开和关闭,文件的关闭文件使用完毕时,应通过关闭文件将流对象与文件脱离开来关闭文件的成员函数void fstreambase:close();说明:关闭文件时,系统将刷新与该流相关的缓冲区文件的打开和关闭操作,可以使一个文件流与多个文件建立联系,但在任意时刻只能与一个文件发生联系。,2008-2009-2,52,2.文件流状态的判别,可以用文件流对象的下列成员函数来判别文件流的当前状态。例如:good():刚进行的操作成功时返回true,否则返回false;eof()

30、:进行输入操作时,若到达文件尾返回true,否则返回false。也可以直接针对流对象进行判断。例如:if(!input)等同于if(input.fail()if(input)等同于if(input.good()可以利用上述函数来检测流是否出错。例如:if(istrm.good()if(!cin.eof(),2008-2009-2,53,例11.16:,问题:分析程序输出结果。,#includeusing namespace std;void main()int a;couta;coutcin.rdstate():cin.rdstate()endlcin.eof():cin.eof()endl;

31、coutcin.bad():cin.bad()endl;coutcin.fail():cin.fail()endl;coutcin.good():cin.good()endl;cin.clear();coutcin.good():cin.good()endl;cin.clear(ios:failbit);coutcin.good():cin.good()endl;,程序运行结果为:Enter an integer:acin.rdstate():2cin.eof():0cin.bad():0cin.fail():1cin.good():0cin.good():1cin.good():0,2008

32、-2009-2,54,3.文本文件的读写操作,对文本文件进行读写操作时,首先要打开文件,然后再对打开文件时设定的文件流进行操作。例11.17 文本文件的写操作。例11.18 文本文件的读操作。例11.19 单个字符的读写例子。,2008-2009-2,55,例11.17:,问题:文本文件的写操作。,#include#include#includevoid main()fstream outfile;/定义文件输出流/以写方式打开文件outfile.open(f2.txt,ios:out);if(!outfile)cout文件打开失败n;abort();/退出程序/利用输出流向文件写入文本 ou

33、tfile.write(把文本写入指定的文件。n,28);/利用输出流向文件写入文本outfile把文本写入到指定的文件中去。n;outfile.close();/关闭文件,2008-2009-2,56,例11.18:,问题:文本文件的读操作。,#include#include#includevoid main()fstream infile;/定义文件输入流/以读方式打开文件infile.open(f2.txt,ios:in);if(!infile)cout文件打开失败.n;abort();/退出程序char s80;while(!infile.eof()/判断文件是否结束/从文本中读取一行

34、infile.getline(s,sizeof(s);coutsendl;infile.close();/关闭文件,程序运行结果为:把文本写入到指定的文件中去。把文本写入到指定的文件中去。,2008-2009-2,57,例11.19:,问题:单个字符的读写例子。,#include#include#include#includevoid main()fstream outfile,infile;/定义输入/出流outfile.open(f3.txt,ios:out);if(!outfile)cout文件打开失败.n;abort();char str=get/put的应用.;for(int i=0

35、;i=strlen(str);i+)outfile.put(stri);/写入一个字符outfile.close();,infile.open(f3.txt,ios:in);if(!infile)cout文件打开失败.n;/abort();exit(1);char ch;while(infile.get(ch)/从文件中读取一个字符coutch;coutendl;infile.close();,程序运行结果为:get/put的应用.,2008-2009-2,58,4.二进制文件的读写操作,打开二进制文件时,在open()函数中需要使用ios:binary方式向二进制文件中写入信息时,需要使用w

36、rite()函数。从二进制文件中读信息,可以使用read()函数。例11.20 对一个二进制文件进行读写操作。,2008-2009-2,59,例11.20:,问题:分析程序输出结果。,#include#include#include#includeclass personprivate:char name20;double height;int age;public:person();person(char*nm,double h,int a)strcpy(name,nm);height=h;age=a;person();void printperson()coutnametheighttag

37、eendl;,void main()person*p;p=new person2;p0=person(wang,165.5,23);p1=person(li,182.8,34);fstream infile,outfile;outfile.open(person.dat,ios:out|ios:binary);if(!outfile)cout文件不能打开!n;abort();for(int i=0;i2;i+)outfile.write(char*),程序运行结果为:wang165.5 23li182.8 34,2008-2009-2,60,5.随机访问数据文件,系统用读或写文件指针记录着流的

38、当前位置。对读指针的操作对写指针的操作例9-24 对读写指针操作,2008-2009-2,61,对读指针的操作,istream类提供了三个成员函数对读指针进行操作istream 说明:和是long型值,字节为单位。有三个值;0,1,2注意:使用seekg()设置了读指针位置,下一次的提取操作就从当前位置开始,提取n字节操作完成后,读指针将被后移n个字节,再次提取操作将从此开始。,2008-2009-2,62,对写指针的操作,写指针操作函数ostream 说明:同读指针操作注意:读函数中曾有get,所以,取g写函数中曾有put,所以,取p,2008-2009-2,63,例11.20:,问题:分析

39、程序输出结果。,#include#include#include#includeclass personprivate:char name20;double height;int age;public:person();person(char*nm,double h,int a)strcpy(name,nm);height=h;age=a;person();void printperson()coutnametheighttageendl;,void main()person*p;p=new person2;p0=person(wang,165.5,23);p1=person(li,182.8

40、,34);person people;fstream file1;file1.open(person.dat,ios:out|ios:in|ios:binary);if(!file1)cout文件不能打开!n;abort();for(int i=0;i2;i+)file1.write(char*),程序运行结果为:li182.8 34wang165.5 23,2008-2009-2,64,小结:,本章主要讲述了流的概念、屏幕输出、键盘输入、格式化输入和输出、磁盘文件的输入和输出、字符串流和流错误的处理的内容。重点:插入符和提取符的重载,磁盘文件的输入和输出难点:磁盘文件的输入和输出,2008-2009-2,65,作业与练习:,作业:理论教程P384-四练习:理论教程P380-1、3、4、6、7,2008-2009-2,66,附录:,表:流类库中预定义的四个流对象表:IOS标志位表:文件打开方式,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号