c教程之输入输出流类库.ppt

上传人:sccc 文档编号:4593853 上传时间:2023-04-29 格式:PPT 页数:76 大小:399.50KB
返回 下载 相关 举报
c教程之输入输出流类库.ppt_第1页
第1页 / 共76页
c教程之输入输出流类库.ppt_第2页
第2页 / 共76页
c教程之输入输出流类库.ppt_第3页
第3页 / 共76页
c教程之输入输出流类库.ppt_第4页
第4页 / 共76页
c教程之输入输出流类库.ppt_第5页
第5页 / 共76页
点击查看更多>>
资源描述

《c教程之输入输出流类库.ppt》由会员分享,可在线阅读,更多相关《c教程之输入输出流类库.ppt(76页珍藏版)》请在三一办公上搜索。

1、第11章,输入输出流类库,本章导读,在C+语言中并没有输入/输出语句其目的是为了最大限度地保证语言与平台的无关性。为了实现输入/输出操作,C+提供了两种方法:一是通过C+提供的与C语言兼容的输入/输出库函数;二是提供了功能强大的输入/输出流类库,在C+中应提倡使用输入/输出流类库来实现。数据从一个对象到另一个对象的传送被抽象为“流”。C+中,外部向内存提供数据的过程称输入流,数据提供者可以是输入设备,也可以是提供数据的文件。同样从内存向外发送数据的过程称输出流,数据接收者可以是输出设备,也可以是保存所接收数据的文件。,本章提要:,1.流概述2.C+的基本流类体系3.标准输入/输出4.文件输入/

2、输出 5.文本文件的使用6.二进制文件的使用,11.2 流概述,流是一个抽象的概念,数据从一个设备(或存储位置)到另一个对象(或存储位置)的传送通道抽象为“流”。1.流和标准流 流是通过称作流类所定义的对象,而流类是用于完成输入/输出操作的类,该类由C+标准库函数iostream.h提供,如cin、cout等。,计算机硬件的五大部件中,输入/输出设备种类繁多,但键盘和显示器是最常用的输入/输出设备,C+中,把键盘和显示器定义为标准设备。在C+中,针对标准设备实现的输入/输出操作,称标准流。标准流有四个:cin、cout、cerr和clog。其中cin是标准输入流,实现从键盘输入数据;其他三个是

3、标准输出流,实现从显示器输出数据(cerr和clog为标准错误信息输出流)。,2.流和缓冲 在实现输入/输出时,计算机系统专门为输入/输出设备开辟一个临时存放信息的区域称缓冲区。引入缓冲的主要目的是为了提高系统的处理效率。在四个标准流中,除cerr为非缓冲流外,其他三个均为缓冲流。对于非缓冲流,一旦数据送入流中,立即进行处理。而对于缓冲流,只有当缓冲区满时,或当前送入换行字符时,系统才对流中的数据进行处理。通常情况下使用缓冲流,对于某些特殊场合,才使用非缓冲流。如果需要立即处理缓冲区中的信息,应强制刷新输出流,此时可在cout的输出项中使用刷新流flush。,3.流和文件 文件是由文件名作为标

4、识的一组有序数据的集合,文件通常存放在磁盘上,所以一般又称磁盘文件。C+提供了两种类型的流:文本流(Text Stream)和二进制流(Binary Stream)。对应的数据文件也分为两种:文本文件和二进制文件。(1)文本文件:由字符的ASCII码组成,以字符为单位存取。文本文件也称为ASCII码文件。(2)二进制文件:由二进制数据组成,以字节为单位存取。二进制文件在传送时均采用二进制流。二进制流与设备上的输入输出一一对应,在数据传送时不需作任何变换。,11.3 C+的基本流类体系,C+的输入/输出流类库包含在iostream.h头文件中。程序中需要完成基本输入/输出操作时,应包含iostr

5、eam.h头文件,其流类体系见图。,1基类ios 类ios是所有基本流类的基类,其它基本流类均由该类派生而来。2输入流类istream 输入流类派生出istream_withassign类,输入流cin就是由其定义的对象。3输出流类ostream 输出流类派生出ostream_withassign类,输出流cout就是由其定义的对象。4输入输出流类iostream iostream流类是类istream和ostream共同派生的。,11.4 标准输入/输出流,基本流类库定义了四个标准流:cin、cout、cerr、clog,以实现数据流的输入与输出操作。11.4.1 标准输入流cincin类i

6、stream_withassign定义的对象。cin所对应的是标准输入设备键盘。cin为缓冲流。,例【11.1】使用流cin实现数据的输入。#include void main(void)int a;couti;cout”i=”iendl;,11.4.2 标准输出流,标准输出流是cout、cerr、clogostream_withassign定义的对象,在缺省的情况下,cout、cerr、clog 所联系的设备文件为显示器,即将数据流输出到显示器上。标准输出流cout、cerr、clog通过重载“”运算符执行数据的输出操作,执行输出操作看作向流中插入一个字符序列,因此将“”称为插入运算符。在三

7、个标准输出流中,cout、clog为缓冲流,而cerr为非缓冲流。,例【11.2】使用流cerr和clog实现数据的输出。#include void main(void)int r;cerrr;clog”r=”3.14159*r*rendl;,11.4.3 流的格式控制,在实际进行输入/输出时,通常要求按照一定的格式输入或输出数据。如要求按照一定的宽度、上下行之间数据对齐等方式输出数据,以使输出信息更直观明了。为此,C+标准输入/输出流提供了许多格式控制操作符和格式控制的成员函数。1.常用的预定义格式控制(见表11-1),2.输入流格式控制 输入流可以实现多种数据类型的输入,如字符型、数值的整

8、型、单精度型或双精度型等。当输入流实现不同类型数据的输入时,是通过重载“”运算符来实现的。在C+中,允许用户根据需要自定义istream的对象,以实现通过其他设备输入数据。当程序中包含头文件iostream.h,系统将自动产生输入流cin。【例11.3】通过输入流cin 分别输入十进制、八进制、十六进制数。,#include void main()int a,b,c;coutdeca;coutoctb;couthexc;couta=aendl;coutb=bendl;coutc=cendl;,3.输出流格式控制,输出流cout与插入运算符“”输出数据时,可对输出数据的格式进行控制,包括输出宽度

9、、输出位置(实现对齐)、精度、填充方式、进制格式等。(1)不同进制数输出 C+中也有两种设置方式实现不同进制数的输出:使用 setiosflags函数和使用C+预定义的格式控制符dec、oct、hex。【例11.4】用setiosflags函数与格式控制符dec、oct、hex,分别实现十进制、八进制和十六进制数的输出。,#include#include void main()int i=100;coutdecitocti;coutthexiendl;coutdec;coutsetiosflags(ios:dec)it;coutsetiosflags(ios:oct)it;coutreseti

10、osflags(ios:oct);coutsetiosflags(ios:hex)it;coutresetiosflags(ios:hex)iendl;,预定义格式控制函数setiosflags的一般格式为:setiosflags()其中:所表示的主要枚举量值如下:ios:dec 指定输入/输出格式为十进制数(默认)ios:oct 指定输入/输出格式为八进制数ios:hex 指定输入/输出格式为十六进制数ios:skipws 在输入中跳过空白ios:left 左对齐,右边用指定填充字符填充ios:right 右对齐,左边用指定填充字符填充(默认方式)ios:internal 在符号或数制字符后

11、进行填充ios:showpoint 对浮点数显示小数点及尾部的0ios:showpos 正数时显示正号符号(+)ios:scientific用科学记数法输出浮点数ios:fixed 用小数点固定格式输出浮点数,(2)设置输出宽度及填充字符 设置输出宽度有两种方法:通过由ios类中定义的输出格式控制成员函数width(int n)和预定义格式控制函数setw(int n)实现。这两个函数的int类型参数n是表示需输出数据的宽度。设置输出宽度时,还可以结合填充成员函数fill(char c)填充字符,其中字符c是需要填充的字符。width成员函数与fill成员函数均在头文件iostream.h中说

12、明。而预定义格式控制函数setw在头文件iomanip.h中说明。,【例11.5】分别使用width成员函数和预定义格式控制函数setw控制输出宽度,同时通过函数fill填充字符。#include#include void main()float pi=3.14125;cout.width(10);coutpiendl;cout.width(10);cout.fill(#);coutpiendl;cout.fill();coutsetw(10)piendl;coutsetw(10);cout.fill(*);coutpiendl;,(3)控制数值输出精度 浮点数输出时,其默认输出的精度为6位。

13、当需要改变输出精度时,可通过预定义格式控制函数setprecision(int n)来设置,其中整型类型n,使用setiosflags(ios:fixed)设置定点输出方式时,是小数点后的有效位数。使用setiosflags(ios:scientific)设置科学记数输出方式时,是整个数值的位数(总长度)。,【例11.6】通过格式控制输出数值的有效位数。#include#include void main()double pi=314.12596;coutpiendl;/A coutsetiosflags(ios:fixed)setprecision(6);coutpiendlresetios

14、flags(ios:fixed);/Bcoutsetiosflags(ios:scientific)setprecision(10);coutpiendlresetiosflags(ios:scientific);/C,(4)缓冲区与刷新流 通过缓冲流实现输出时,只有当缓冲区满时,才对输出流中的数据进行处理。如果需要立即处理缓冲区中的信息,可通过强制刷新输出流,实现即时输出。在cout的输出项中可使用刷新流flush。,例【11.7】使用缓冲流cout和非缓冲流cerr实现输出情况的比较。#includevoid main()int a=10;cerr通过 cerr输出!n;/Acout通过

15、cout输出!n;/Bcouta/0endl;/C,11.4.4 输入/输出的其他成员函数,1.输入操作的成员函数(1)单个字符输入的成员函数输入单个字符的成员函数有两种格式:int istream:get();istream,例【11.8】分别使用两种格式输入字符。#includevoid main()char c1,c2;c1=cin.get();cin.get(c2);coutc1tc2endl;,(2)字符串输入的成员函数字符串输入的成员函数也有两种格式:istream,例【11.9】分别使用两种格式输入字符串。#includevoid main()char c1100,c2100;c

16、in.get(c1,100);/Acin.getline(c2,100,u);/Bcoutc1c2endl;,(3)peek()和putback()peek():查看当前要提取的字符。putback():向流中插入一个字符。,#includevoid main()char ch;cin.get(ch);while(ch!=.)if(ch=a)cin.putback(b);coutch;while(cin.peek()=m)cin.get();cin.get(ch);coutendl;,2.数据输出成员函数put()、write()、flush()put()用于发送一个字符,可连续使用。ostr

17、eam flush()用于刷新输出流。,例【11.11】使用put()函数实现字符输出。#includevoid main()char a20=I am a student.;cout.put(a0).put(a1).put(a2).put(a3).put(n);cout.write(a,10);cout.put(n);,11.4.5 提取和插入运算符重载,在C+中允许用户重载运算符“”,以实现对象的直接输入/输出。但必须通过友元函数实现“”运算符重载,不可以通过成员函数实现。其原因是这两个运算符的左操作数不可能是该类的对象,而是流类的对象cin、cout等。(1)重载提取运算符“”的一般格式

18、为:friend istream,重载提取运算符“”时,函数返回值必须是类istream的引用。非引用时,cin后面只能有一个提取运算符,如果要满足cin中可以连续使用“”运算符,则必须是引用。格式中,运算符重载函数的第一个参数也必须是类istream的引用,作为运算符的左操作数,第二个参数为自定义类的对象引用,作为运算符的右操作数。须注意,在重载提取运算符“”时,第二个参数必须是引用,否则在运算符重载函数中对对象的输入,无法返回到对应的实参对象。,(2)重载插入运算符“”类同,重载插入运算符“”时,函数返回值必须是类ostream的引用,这也是为了在cout中可以连续使用“”运算符。函数的第

19、一个参数是类ostream的引用,第二个参数为自定义类的对象或对象引用。,【例11.12】重载提取和插入运算符,实现时间类的输入和输出。#includeclass Time int Hour,Minute,Second;public:Time(int h=0.0,int m=0.0,int s=0)Hour=h;Minute=m;Second=s;friend ostream,ostream/B,11.5.1 文件概述 文件是由文件名标识的一组有序数据的集合,文件通常存放在磁盘上。在C+中,磁盘文件只是文件的一种,具体的外部设备,也可以抽象为文件,系统为每个外部设备都指定唯一的一个设备名(文件

20、名)。这样对外部设备的操作也抽象为对文件的操作,对程序设计而言,只要掌握文件的操作,就可以实现对不同具体设备的操作,实现了语言与设备的无关。,11.5 文件流,在C+中,文件分为两种:文本文件和二进制文件。(1)文本文件:由字符的ASCII码组成,以字符为单位存取。文本文件也称为ASCII码文件。(2)二进制文件:由二进制数据组成,以字节为单位存取。使用文件时,必须先打开文件,然后才能对文件进行读或写操作,操作完成后应关闭文件。,在C+头文件fstream.h中,定义了文件流类体系,文件流类体系如图。由图可知C+的文件流类体系是从C+的基本流类体系中派生出来的。当程序中使用文件时,需要包含头文

21、件fstream.h。,11.5.2 文件流类体系,11.5.3 文件的使用方法,在C+中,文件的使用主要有打开、读/写、关闭文件等操作。使用文件首先需要通过文件输入流类ifstream、文件输出流类ofstream或文件输入/输出流类fstream定义文件流对象(也直接称文件流),然后通过文件流调用对应的成员函数完成对文件的相关操作。,对文件的操作一般有三种情况:从文件读数据、向文件写数据、对文件既可读也可写操作。通过流类ifstream、ofstream、fstream定义文件流。ifstream 只能用来定义读文件流对象.如:ifstream infile;ofstream只能用来定义写

22、文件流对象.如:ofstream outfile;fstream用来定义既可读也可写的文件流对象.如:fstream iofile;,1.打开文件打开文件有二种方式:文件流通过open成员函数在定义文件流对象时通过构造函数。,1)使用成员函数open打开文件:路径名e:testdata.txt 应表示为:e:testdata.txt。通过open函数打开文件的语句为:ifstream infile;infile.open(e:testdata.txt);ofstream outfile;outfile.open(e:testdata.txt);fstream iofile;ofile.open

23、(e:testdata.txt,ios:in|ios:out);,文件打开方式有以下八种:ios:in/按读(输入)方式打开文件,若文件不存在,则自动建立新文件ios:out/按写(输出)方式打开文件,若文件不存在,则自动建立新文件ios:ate/打开文件,使文件读写指针移到文件末尾ios:app/打开文件,不删除文件数据,将新数据增加到文件尾部ios:trunc/打开文件,并清除文件原有数据(默认方式)ios:nocreate/只能打开已存在文件,如文件不存在则打开失败。通常nocreate方式不单独使用,总是与读/写方式同时使用。,ios:noreplace/建立新文件,如文件已存在则建立

24、失败ios:binay/必须明确指定binary方式打开文件,才是二进制文件,该标志总是与读或写同时使用,表示打开二进制文件。在使用上述打开方式时,可以把多种方式结合在一起使用,中间用|连接。如:ios:out|ios:app,表示按写(输出)方式打开文件,并把新写的数据添加到文件末尾。,(2)定义文件流对象时,通过构造函数打开文件,ifstream infile(e:testdata.txt);ofstream outfile(e:testdata.txt);fstream iofile(e:testdata.txt,ios:in|ios:out);测试打开文件是否成功的程序段如下:ifst

25、ream infile(e:testdata.txt);if(!infile)cout不能打开的文件:e:testdata.txt n;exit(1);,2.文件的读/写操作,对文件进行读/写操作有两种方法:一种方法是使用提取、插入运算符。例如:char ch;infilech;/提取一个字符赋于变量ch。outfilech;/输出到文件中。另一种方法是使用成员函数对文件进行读写操作。例如:char ch;infile.get(ch);/从输入文件中读取一个字符赋于ch。outfile.put(ch);/写入到输出文件流中去。,3.关闭文件,【例11.13】把1100的所有数据存放到文件dat

26、a1.dat文件中。#includevoid main(void)fstream outfile(data1.dat,ios:out);/ofstream outfile(data1.dat);/fstream outfile;/outfile.open(data1.dat,ios:out);for(int i=1;i=100;i+)outfilei;outfile.close();,【例11.14】把上例中存放在文件data1.dat中的1100所有数据读出并显示在屏幕上。#include#includevoid main(void)fstream infile(data1.dat,ios:

27、in);/ifstream infile(data1.dat);/fstream infile;/infile.open(data1.dat,ios:in);int a,i;for(i=1;ia;/A coutat;/B infile.close();,11.6 文本文件的使用,对文件的基本操作与标准输入/输出的使用方式相同,既可以通过提取运算符“”和插入运算符“”来访问文件,也可以通过get()、getline()和put()等成员函数实现。【例11.15】使用提取和插入运算符将例11.13中建立的data1.dat数据文件复制到data2.dat。,#include#include#inc

28、ludevoid main(void)ifstreaminfile(data1.dat,ios:in|ios:nocreate);ofstream outfile(data2.dat);if(!infile)coutch)outfilech;infile.close();outfile.close();,【例11.16】使用get()函数和put()函数将例11.13中建立的data1.dat数据文件复制到data3.dat。#include#include#includevoid main(void)ifstream infile(data1.dat,ios:in|ios:nocreate)

29、;ofstream outfile(data3.dat);if(!infile)/如指定文件不存在,则表达式!infile为真值。cout不能打开data1.dat数据文件!n;exit(1);infile.unsetf(ios:skipws);char ch;while(infile.get(ch)outfile.put(ch);infile.close();outfile.close();,【例11.17】说明一个结构体类型,建立学生档案。#includestruct studentchar name10;char sex4;int age;float cscore;,void main(

30、void)student s3=张敏,男,20,83,王平,男,21,78,刘丽,女,20,90;ofstream outfile(student.txt);for(int i=0;i3;i+)outfilesi.name si.sex si.age si.cscoren;outfile.close();,【例11.18】将上例建立的学生档案读出并输出到屏幕。#includestruct student char name10;char sex4;int age;float cscore;void main(void)student s3;ifstream infile(student.txt

31、);for(int i=0;isi.namesi.sexsi.agesi.cscore;for(i=0;i3;i+)cout姓名:si.namet性别:si.sext;cout年龄:si.agetc+si.cscoren;infile.close();,【例11.19】分别通过插入运算符、get()函数、getline()函数put()函数实现对文字信息文本文件的输入/输出。#includevoid main(void)char str1100=I am a student!;char str2100=You are a student!;char str3100=He is a studen

32、t!;char ch;ofstream outfile(data4.txt);outfilestr1n;outfilestr2n;outfilestr3n;,outfile.close();ifstream infile(data4.txt,ios:in|ios:nocreate);outfile.open(data4a.txt);while(infile.get(ch)outfile.put(ch);infile.close();outfile.close();infile.open(data4a.txt,ios:in|ios:nocreate);while(infile.getline(s

33、tr1,100)coutstr1endl;infile.close();,11.7 二进制文件的使用,在C+中,文件分为两种类型:文本文件和二进制文件。文件的类型不同,文件中数据的存放格式就不同,因此在对文件进行读写操作时,必须区分文本文件和二进制文件。在C+流类的基类中,提供了ios:binary打开方式标志。打开文件时,如果没有ios:binary标志,则表示是文本文件,反之是二进制文件。,11.7.1 二进制文件的打开和关闭,打开二进制文件时,不论是通过open成员函数还是通过构造函数与文件建立联系,都须包含ios:binay标志。如通过open函数打开二进制文件的语句:ifstream

34、 infile;infile.open(e:testdata.txt,ios:in|ios:binary);ofstream outfile;outfile.open(e:testdata.txt,ios:out|ios:binary);fstream iof;iof.open(e:testdata.txt,ios:in|ios:out|ios:binary);,通过构造函数打开二进制文件的语句:ifstream infile(e:testdata.txt,ios:in|ios:binary);ofstream outfile(e:testdata.txt,ios:out|ios:binary

35、);fstream iof(e:testdata.txt,ios:in|ios:binary);二进制文件的关闭方式与文本文件完全相同。,11.7.2 二进制文件的读/写,1.read()函数 对二进制文件的读操作通过read()成员函数实现。read()函数的格式如下:istream 函数中第二个整型参数表示要读出数据的大小(单位是字节),第一个参数是字符型指针表示要读入的数据所存放的存储单元。,2.write()函数对二进制文件的写操作是通过write()成员函数实现。write()函数的格式如下:ostream 函数中第二个整型参数表示要写入数据的大小(单位是字节),第一个参数也是字符型

36、指针表示要准备写入数据所存放的位置。提示:在read()函数和write()函数中,第一个参数必须是字符指针,如果是其他类型则必须强制转换成字符指针类型。,3.eof()函数 当读取二进制数据文件时,可通过eof()成员函数判断是否到文件结束位置。eof()成员函数的格式为:int ios:eof();当读取数据到达文件结束位置时,eof()函数返回非零值,否则返回零值。eof()函数常用于读取数据时,判定数据是否读取完毕。,【例11.20】把1100的所有数据存放到二进制文件data5.dat中。#includevoid main(void)ofstreamoutfile(data5.dat

37、,ios:out|ios:binary);for(int i=1;i=100;i+)outfile.write(char*),【例11.21】把上例建立的二进制文件data5.dat中所有数据读出并显示在屏幕上。#include#includevoid main(void)ifstream infile(data5.dat,ios:in|ios:binary);int a;while(!infile.eof()infile.read(char*),【例11.22】把例11.19建立的二进制文件data5.dat中所有数据,一次读出并显示在屏幕上。#include#includevoid mai

38、n(void)ifstream infile(data5.dat,ios:in|ios:binary);int a100;infile.read(char*)a,sizeof(int)*100);for(int i=0;i100;i+)coutait;coutn;infile.close();,上述介绍的文件读写操作,都是采用顺序读写方式。文件打开时,系统为打开的文件建立一个point指针变量,每当读写数据时,系统将自动修改point指针,使point指针自动指向下一个数据,直到文件中所有数据读写完毕。实际上,除按顺序方式完成文件读/写操作外,C+文件流类的基类中,还定义了支持随机访问的函数来

39、移动指针值,实现对文件的随机访问。,11.7.3 文件的随机访问,1.seekg()与seekp()成员函数 seekg()函数用于移动输入文件流中的文件指针,seekp()函数用于移动输出文件流中的文件指针,其函数的格式分别为:istream,其中,streampos和streamoff相当于基本数据类型中的long。前两个函数的功能都是将文件指针直接指向参数n指定的字节处(直接定位)。后两个函数的功能是由seek_dir确定位置(相对定位)。seek_dir是一个枚举类型,可取以下三个值:ios:beg/把文件起始位置作为参照点,移动文件指针到指定位置ios:cur/把文件当前位置作为参照

40、点,移动文件指针到指定位置ios:end/把文件结束位置作为参照点,移动文件指针到指定位置 格式中,seekg的g表示get的含义,用于移动输入流文件中的指针。seekp的p表示put的含义,用于移动输出流文件中的指针。,【例11.23】通过seekg()与seekp()成员函数,实现数据的随机读写。#include#includevoid main(void)ofstream outfile(data6.dat,ios:out|ios:binary);int i,a;for(i=1;i=10;i+)outfile.write(char*),outfile.seekp(1*sizeof(int

41、);/第2个outfile.write(char*),infile.seekg(1*sizeof(int);infile.read(char*),2.返回文件指针值在对文件的读/写过程中,可以通过tellg()函数和tellp()函数返回当前文件指针的位置。tellg():返回输入文件流的当前文件指针值。tellp():返回输出文件流的当前文件指针值。,【例11.24】通过tellg()函数和tellp()函数返回当前文件指针的位置。#include#includevoid main(void)ofstream outfile(data7.dat,ios:out|ios:binary);int i,a;for(i=1;i=10;i+)coutoutfile.tellp()t;outfile.write(char*),ifstream infile(data7.dat,ios:out|ios:binary);for(i=1;i=10;i+)coutinfile.tellg()t;infile.read(char*),

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

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号