《C程序设计》电子教案第10章流类库与输入输出.ppt

上传人:小飞机 文档编号:6525792 上传时间:2023-11-09 格式:PPT 页数:59 大小:219.66KB
返回 下载 相关 举报
《C程序设计》电子教案第10章流类库与输入输出.ppt_第1页
第1页 / 共59页
《C程序设计》电子教案第10章流类库与输入输出.ppt_第2页
第2页 / 共59页
《C程序设计》电子教案第10章流类库与输入输出.ppt_第3页
第3页 / 共59页
《C程序设计》电子教案第10章流类库与输入输出.ppt_第4页
第4页 / 共59页
《C程序设计》电子教案第10章流类库与输入输出.ppt_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《《C程序设计》电子教案第10章流类库与输入输出.ppt》由会员分享,可在线阅读,更多相关《《C程序设计》电子教案第10章流类库与输入输出.ppt(59页珍藏版)》请在三一办公上搜索。

1、第10章 流类库与输入输出,10.1 I/O标准流类10.2 格式化I/O10.3 文件流10.4 字符串流,10.1 I/O标准流类,10.1.1 预定义流10.1.2 C+中的流类库,返回首页,在C+语言中,数据的输入和输出(简写为I/O)包括对标准输入设备键盘和标准输出设备显示器、对在外存磁盘上的文件和对内存中指定的字符串存储空间进行输入输出这三个方面。对标准输入设备和标准输出设备的输入输出简称为标准I/O,对在外存磁盘上文件的输入输出简称为文件I/O,对内存中指定的字符串存储空间的输入输出简称为串I/O。,C+中把数据之间的传输操作称作流。在C+中,流既可以表示数据从内存传送到某个载体

2、或设备中,即输出流;也可以表示数据从某个载体或设备传送到内存缓冲区变量中,即输入流。在进行I/O操作时,首先打开操作,使流和文件发生联系,建立联系后的文件才允许数据流入或流出,输入或输出结束后,使用关闭操作使文件与流断开联系。,C+中所有流都是相同的,但文件可以不同。使用流以后,程序用流统一对各种计算机设备和文件进行操作,使程序与设备、程序与文件无关,从而提高了程序设计的通用性和灵活性。也就是说,无论与流相联系的实际物理设备差别有多大,流都采用相同的方式运行。这种机制使得流可以跨越物理设备平台,实现流的透明运作,而与实际的物理设备无关。例如,往显示器上输出字符和向磁盘文件或打印机输出字符,尽管

3、接受输出的物理设备不同,但具体操作过程是相同的。,10.1.1 预定义流,1cout在ostream输出流类中定义有对左移操作符重载的一组公用成员函数,函数的具体声明格式为:istream,3cerrcerr类似标准错误文件。cerr与cout的差别在于:(1)cerr不能重定向。(2)cerr不能被缓冲,它的输出总是直接传达到标准输出设备上。4clogclog是不能重定向的,但是可以被缓冲。在某些系统中,由于缓冲,使用clog代替cerr可以改进显示速度。clog Error n;,返回本节,10.1.2 C+中的流类库,C+语言系统为实现数据的输入和输出定义了一个庞大的类库,它包括的类主要

4、有ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrstream和strstream等。其中ios为根基类,它直接派生四个类:输入流类istream、输出流类ostream、文件流基类fstreambase和字符串流基类strstreambase,输入文件流类ifstream同时继承了输入流类和文件流基类(当然对于根基类是间接继承),输出文件流类ofstream同时继承了输出流类和文件流基类,输入字符串流类istrstream同时继承了输入流类和字符串流基类,输出字符串流类ostrstream同时继承了输

5、出流类和字符串流基类,输入输出流类iostream同时继承了输入流类和输出流类,输入输出文件流类fstream同时继承了输入输出流类和文件流基类,输入输出字符串流类strstream同时继承了输入输出流类和字符串流基类。,返回本节,10.2 格式化I/O,10.2.1 ios类中的枚举常量10.2.2 使用ios成员函数10.2.3 使用I/O操作符10.2.4 检测流操作的错误,返回首页,10.2.1 ios类中的枚举常量,在根基类ios中定义有三个用户需要使用的枚举类型,由于它们是在公用成员部分定义的,所以其中的每个枚举类型常量在加上ios:前缀后都可以为本类成员函数和所有外部函数访问。在

6、三个枚举类型中有一个无名枚举类型,其中定义的每个枚举常量都是用于设置控制输入输出格式的标志使用的。该枚举类型定义如下:enum skipws,left,right,internal,dec,oct,hex,showbase,showpoint,uppercase,showpos,scientific,fixed,unitbuf,stdio;,各枚举常量的含义如下:(1)skipws。(2)left,right,internal。(3)dec,oct,hex。(4)showbase。(5)showpoint。(6)uppercase。(7)showpos。(8)scientific,fixed。

7、(9)unitbuf,stdio。,返回本节,10.2.2 使用ios成员函数,ios类提供成员函数对流的状态进行检测和进行输入输出格式控制等操作,每个成员函数的声明格式和简要说明如下:int bad();/操作出错时返回非0值int eof();/读取到流中最后的文件结束符时返回非0值int fail();/操作失败时返回非0值void clear();/清除bad,eof和fail所对应的标志状态,使之恢复为正常状态/值0,使good标志状态恢复为1char fill();/返回当前使用的填充字符char fill(char c);/重新设置流中用于输出数据的填充字符为c的值,返回/此前的

8、填充字符。系统预设置填充字符为空格long flags();/返回当前用于I/O控制的格式状态字,long flags(long f);/重新设置格式状态字为f的值,返回此前的格式状态字int good();/操作正常时返回非0值,当操作出错、失败和读到文件/结束符时均为不正常,则返回0int precision();/返回浮点数输出精度,即输出的有效数字的位数int precision(int n);/设置浮点数的输出精度为n,返回此前的输出精度。系统预设/置的输出精度为6,即输出的浮点数最多具有6位为有效数字int rdstate();/操作正常时返回0,否则返回非0值,它与good()正

9、好相反long setf(long f);/根据参数f设置相应的格式化标志,返回此前的设置。该参数/f所对应的实参为无名枚举类型中的枚举常量(又称格式化常/量),可以同时使用一个或多个常量,每两个常量之间要用按位或/操作符连接。如需要左对齐输出,并使数值中的字母大写时,/则调用该函数的实参为ios:left|ios:uppercase,long unsetf(long f);/根据参数f清除相应的格式化标志,返回此前的设置。如要/清除此前的左对齐输出设置,恢复默认的右对齐输出设置,/则调用该函数的实参为ios:leftint width();/返回当前的输出域宽。若返回数值0则表明没为刚才输出

10、的数/值设置输出域宽。输出域宽是指输出的值在流中所占有的字节数int width(int w);/设置下一个数据值的输出域宽为w,返回为输出上一个数据值/所规定的域宽,若无规定则返回0。注意:此设置不是一直有/效,而只是对下一个输出数据有效,例10-2:给出以下程序的运行结果。#includevoid main()int x=123;double y=-3.456789;coutx=;cout.width(10);/设置输出下一个数据的域宽为10 coutx;/按默认的右对齐输出,剩余位置填充空格字符 couty=;cout.width(10);/设置输出下一个数据的域宽为10 coutyen

11、dl;cout.setf(ios:left);/设置按左对齐输出,coutx=;cout.width(10);coutx;couty=;cout.width(10);coutyendl;cout.fill(*);/设置填充字符为*cout.precision(3);/设置浮点数输出精度为3 cout.setf(ios:showpos);/设置正数的正号输出 coutx=;cout.width(10);coutx;couty=;cout.width(10);coutyendl;,此程序运行结果如下:x=123y=-3.45679x=123 y=-3.45679x=+123*y=-3.46*,例1

12、0-3:给出以下程序的运行结果。#includevoid main()float x=12,y=-3.456;coutx yendl;cout.setf(ios:showpoint);/强制显示小数点和无效0 coutx yendl;cout.unsetf(ios:showpoint);/恢复默认输出 cout.setf(ios:scientific);/设置按科学表示法输出 coutx yendl;cout.setf(ios:fixed);/设置按定点表示法输出 coutx yendl;,程序运行结果如下:12-3.45612.0000-3.456001.200000e+001-3.4560

13、00e+00012-3.456,返回本节,10.2.3 使用I/O操作符,数据输入输出的格式控制还有更简便的形式,就是使用系统头文件iomanip.h中提供的操作符。使用这些操纵符不需要调用成员函数,只要把它们作为插入操作符)的输出对象即可。,例10-4:给出以下程序的运行结果。#include/因iomanip.h中包含有iostream.h,所以该命令可省略#includevoid main()int x=12,y=345,z=6789;coutx y zendl;/按十进制输出 coutoctx y zendl;/按八进制输出 couthexx y zendl;/按十六进制输出 cout

14、setiosflags(ios:showbase|ios:uppercase);/设置基指示符和数值中的字母大写输出 coutx y zendl;/仍按十六进制输出 coutresetiosflags(ios:showbase|ios:uppercase);/取消基指示符和数值中的字母大写输出 coutx y zendl;/仍按十六进制输出 coutdecx y zendl;/按十进制输出,例10-5:给出以下程序的运行结果。#include#includevoid main()int x=123;double y=-3.456789;coutx=setw(10)x;couty=setw(10

15、)yendl;coutsetiosflags(ios:left);/设置按左对齐输出 coutx=setw(10)x;couty=setw(10)yendl;,coutsetfill(*);/设置填充字符为*coutsetprecision(3);/设置浮点数输出精度为3 coutsetiosflags(ios:showpos);/设置正数的正号输出 coutx=setw(10)x;couty=setw(10)yendl;coutresetiosflags(ios:left|ios:showpos);coutsetfill();,返回本节,10.2.4 检测流操作的错误,在I/O流的操作过程中

16、可能出现各种错误,每一个流都有一个状态标志字,以指示是否发生了错误以及出现了哪种类型的错误,这种处理技术与格式控制标志字是相同的。ios类定义了以下枚举类型:enum io_state goodbit=0 x00,/不设置任何位,一切正常 eofbit=0 x01,/输入流已经结束,无字符可读入 failbit=0 x02,/上次读/写操作失败,但流仍可使用 badbit=0 x04,/试图作无效的读/写操作,流不再可用 hardfail=0 x80/不可恢复的严重错误;,返回本节,10.3 文件流,10.3.1 文件的概念10.3.2 文件的打开与关闭10.3.3 文件的读写,返回首页,10

17、.3.1 文件的概念,在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目录之下。一个文件名由文件主名和扩展名两部分组成,它们之间用圆点(即小数点)分开,扩展名可以省略,当省略时也要省略掉前面的圆点。文件主名是由用户命名的一个有效的C+标识符,为了同其他软件系统兼容,一般让文件主名为不超过8个有效字符的标识符,同时为了便于记忆和使用,最好使文件主名的含义与所存的文件内容相一致。,在C+程序中使用的保存数据的文件按存储格式分为两种类型,一种为字符格式文件,简称字符文件,另一种为内部格式文件,简称字节文件。字符文件又称ASCII码

18、文件或文本文件,字节文件又称二进制文件。,C+程序文件,利用其他各种语言编写的程序文件,用户建立的各种文本文件,各种软件系统中的帮助文件等,因都是ASCII码文件,所以都可以在C+中作为字符文件使用。C+系统把各种外部设备也看作为相应的文件。如把标准输入设备键盘和标准输出设备显示器看作为标准输入输出文件,其文件名(又称设备名)为con,当向它输出信息时就是输出到显示器,当从它输入信息时就是从键盘输入。,返回本节,10.3.2 文件的打开与关闭,流可以分为3类:输入流、输出流以及输入/输出流,相应地必须将流说明为ifstream、ofstream以及fstream类的对象。例如:ifstream

19、 ifile;/说明一个输入流ofstream ofile;/说明一个输出流fstream iofile;/说明一个输入/输出流,说明了流对象之后,可使用函数open()打开文件。文件的打开即是在流与文件之间建立一个连接。open()的函数原型为:void open(const char*filename,int mode,int prot=filebuf:openprot);,ios:in 打开文件进行读操作ios:out 打开文件进行写操作ios:ate 打开时文件指针定位到文件尾ios:app 添加模式,所有增加都在文件尾部进行ios:trunc 如果文件已存在则清空原文件ios:noc

20、reate 如果文件不存在则打开失败ios:noreplace如果文件存在则打开失败ios:binary 二进制文件(非文本文件),下面对文件的打开方式作几点说明:(1)文件的打开方式可以为上述的一个枚举常量,也可以为多个枚举常量构成的按位或表达式。(2)使用open成员函数打开一个文件时,若由字符指针参数所指定的文件不存在,则建立该文件。(3)当打开方式中不含有ios:ate或ios:app选项时,则文件指针被自动移到文件的开始位置,即字节地址为0的位置。(4)当用输入文件流对象调用open成员函数打开一个文件时,打开方式参数可以省略,默认按ios:in方式打开,若打开方式参数中不含有ios

21、:in选项时,则会自动被加上。,下面给出定义文件流对象和打开文件的一些例子:(1)ofstream fout;fout.open(a:aaa.dat);/字符串中的双反斜线表示一个反斜线(2)ifstream fin;fin.open(a:bbb.dat,ios:in|ios:nocreate);(3)ofstream ofs;ofs.open(a:ccc.dat,ios:app);(4)fstream fio;fio.open(a:ddd.ran,ios:in|ios:out|ios:binary);,返回本节,10.3.3 文件的读写,1文件读写方法(1)使用流运算符直接读写。(2)使用流

22、成员函数。常用的输出流成员函数如下:put函数 write函数 get函数 read函数 getline函数,下面对文件的打开方式作几点说明:(1)向字符文件输出数据有两种方法,一种是调用从ostream流类中继承来的插入操作符重载函数,另一种是调用从ostream流类中继承来的put成员函数。(2)从打开的字符文件中输入数据到内存变量有三种方法。(3)当使用流对象调用get()成员函数时,通过判断返回值是否等于文件结束符EOF可知文件中的数据是否被输入完毕。,2文本文件的读写文本文件只适用于那些解释为ASCII码的文件。处理文本文件时将自动作一些字符转换,如输出换行字符0 x0A时将转换为回

23、车0 x0D与换行0 x0A两个字符存入文本文件,读入时也会将回车与换行两个字符合并为一个换行字符,这样内存中的字符与写入文件中的字符之间就不再是一一对应关系。文本文件的结束以ASCII码的控制字符0 x1A表示。,例10-7:向a盘上的write1.dat文件输出010之间的整数,含0和10在内。#include#include#includevoid main(void)ofstream f1(a:/write1.dat);/定义输出文件流,并打开相应文件,若打开/失败则f1带回0值 if(!f1)/当f1打开失败时进行错误处理 cerra:/write1.dat file not ope

24、n!endl;exit(1);for(int i=0;i10;i+)f1i;/向f1文件流输出i值 f1.close();/关闭f1所对应的文件,例10-9:假定一个结构数组a中的元素类型pupil包含有表示姓名的字符指针域name和表示成绩的整数域grade,试编写一个函数把该数组中的n个元素输出到字符文件“a:/write3.dat”中。#include#includevoid ArrayOut(pupil a,int n)ofstream f3(a:/write3.dat);if(!file3)/当file3打开失败时进行错误处理 cerrFile of a:/write3.dat no

25、t open!endl;exit(1);,for(int i=0;in;i+)file3ai.nameendlai.gradeendl;file3.close();若已经为输出pupil类型的数据定义了如下插入操作符重载函数:ostream”。,例10-10:从例10-7所建立的a:/write1.dat文件中输入全部数据并依次显示到屏幕上。#include#include#includevoid main(void)ifstream f1(a:/write1.dat,ios:in|ios:nocreate);/定义输入文件流,并打开相应文件,若打开失败则file1带回0值 if(!file1

26、)/当file1打开失败时进行错误处理 cerra:/write1.dat file not open!endl;exit(1);,int x;while(file1x)/依次从文件中输入整数到x,当读到的是文件结束符时条件表达式/的值为0 coutx;coutendl;file1.close();/关闭file1所对应的文件该程序运行结果如下:0 1 2 3 4 5 6 7 8 9,3二进制文件的读写二进制文件不同于文本文件,它可用于任何类型的文件(包括文本文件),读写二进制文件的字符不作任何转换,读写的字符与文件之间是完全一致的。一般地,对二进制文件的读写可采用两种方法:一种是使用get(

27、)和put();另一种是使用read()和write()。,例10-12:二进制文件读写的示例程序。#includestruct Date int month,day,year;void main()Date dt=02,07,1975;Ofstream ofile(“dsc.dat”,ios:binary);Ofile.write(char*),4文件的随机读写(1)输出流随机访问函数。(2)输入流随机访问函数。,例10-13:编写一个程序,随机读写指定位置上的字符。#include#include int main()ifstream ifile;char fn20;coutfn;ifil

28、e.open(fn);if(!ifile),coutpos;if(posmaxpos)coutThe position of file isnt rightendl;,else char ch;ifile.seekg(pos);ifile.get(ch);coutchendl;ifile.close();return 1;如果需要读取多个字节的数据,则可将ifile.get(ch);改为:ifile.read(char*),返回本节,10.4 字符串流,10.4.1 字符串流概述10.4.2 istrstream类的构造函数10.4.3 ostrstream类的构造函数,返回首页,10.4.1

29、 字符串流概述,字符串流类包括输入字符串流类istrstream,输出字符串流类ostrstream和输入输出字符串流类strstream三种。它们都被定义在系统头文件strstrea.h中。只要在程序中带有该头文件,就可以使用任一种字符串流类定义字符串流对象。每个字符串流对象简称为字符串流。字符串流对应的访问空间是内存中由用户定义的字符数组,而文件流对应的访问空间是外存上由文件名确定的文件存储空间。,三种字符串流类的构造函数声明格式分别如下:istrstream(const char*buffer);ostrstream(char*buffer,int n);strstream(char*b

30、uffer,int n,int mode);,下面给出定义相应字符串流的例子。(1)ostrstream sout(a1,50);(2)istrstream sin(a2);(3)strstream sio(a3,sizeof(a3),ios:in|ios:out);,返回本节,10.4.2 istrstream类的构造函数,istrstream类的构造函数的原型分别是:istrstream:istrstream(char*s);istrstream:istrstream(char*s,int n);这两个构造函数的第一个参数s是一个字符指针或字符数组,使用该串来初始化要创建的流对象。第一个构

31、造函数是使用所指定的串的全部内容来构造流对象,而第二个构造函数使用串中前n个字符来构造串对象。,下面举例说明上述构造函数的用法。例10-14:从一个字符串流中输入用逗号分开的每一个整数并显示出来。#includevoid main()char a=12,34,56,78,90,87,65,43;coutaendl;/输出a字符串 istrstream sin(a);/定义一个输入字符串流sin,使用的字符数组为a char ch=;int x;while(ch!=),/使用字符作为字符串流结束标志 sinwsxws;/从流中读入一个整数,并使用操作符ws读取/一个整数前后的空白字符 coutx

32、;/输出x的值并后跟一个空格 sin.get(ch);/从sin流中读入一个字符,实际读取的是,或字符 coutendl;此程序的运行结果为:12,34,56,78,90,87,65,4312 34 56 78 90 87 65 43,例10-15:分析下列程序的运行结果。#include#include void main()char buf=1234567;int i,j;istrstream s1(buf);s1i;istrstream s2(buf,3);s2j;couti+jendl;此程序的运行结果为:1234690,返回本节,10.4.3 ostrstream类的构造函数,ost

33、rstream类的构造函数的原型分别是:ostrstream:ostrstream();ostrstream:ostrstream(char*s,int n,int mode=ios:out);ostrstream类还提供了如下成员函数:int ostrstream:pcount();char*ostrstream:str();,例10-16:从一个字符串中得到每一个整数,并把它们依次存入到一个字符串流中,最后向屏幕输出这个字符串流。#includevoid main()char a50;char b50;istrstream sin(a);/定义一个输入字符串流sin,使用的字符数组为a o

34、strstream sout(b,sizeof(b);/定义一个输出字符串流sout,使用的字符数组为b cin.getline(a,sizeof(a);/假定从键盘上输入的字符串为 ab12+34,56*78-90/cd123,ABC45DE:fg67;89 char ch=;,int x;while(ch!=)/使用字符作为字符串流结束标志 if(ch=48/从sin流中读入下一个字符,soutends;/向sout流输出作为结束符的字符和一个字符串结束符0 coutb;/输出字符串流sout对应的字符串 coutendl;该程序的运行结果如下:ab12+34,56*78-90/cd123,ABC45DE:fg67;8912 34 56 78 90 123 45 67 89,返回本节,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号