《输入输出流类幻灯片.ppt》由会员分享,可在线阅读,更多相关《输入输出流类幻灯片.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、输入输出流类第1页,共42页,编辑于2022年,星期三外外部部设设备备可可分分为为人人机机交交互互设设备备和和存存储设备储设备两个大类。两个大类。人人机机交交互互设设备备主主要要指指键键盘盘、显显示示器器等终端控制台设备和打印机。等终端控制台设备和打印机。存存储储设设备备指指磁磁带带、磁磁(软软、硬硬)盘盘、光光盘盘等等以以文文件件形形式式存存储储持持久久数数据据的设备。的设备。第2页,共42页,编辑于2022年,星期三早早期期程程序序设设计计语语言言中中通通常常以以文文件件方方式式来来统统一一人人机机交交互互设设备备和和存存储储设设备备的的输输入入输输出出操操作作。即即将将人人机机交交互互设
2、设备备当当作作一一种种特特殊殊文件对待。文件对待。以以文文件件方方式式统统一一管管理理外外部部设设备备可可以以屏屏蔽蔽实实际际物物理理设设备备的的差差异异,有有利利于于整整体体上上简简化化程程序序设设计计语语言言与与外外部部设设备备交交换信息的处理过程。换信息的处理过程。第3页,共42页,编辑于2022年,星期三C+语语言言对对输输入入输输出出的的处处理理引引入入了了“流流”这这个个比比文文件件抽抽象象程程度度更更高高的的概概念念。输输入入输输出出操操作作被被看看作作数数据据在在源源设设备备对对象象与与目目标标设设备备对对象象之之间的流动。间的流动。C+中中完完成成输输入入输输出出操操作作的的
3、类类称称为为流流类类,并提供了可重用的流类库。并提供了可重用的流类库。第4页,共42页,编辑于2022年,星期三11.1 C+流库结构流库结构标标准准ANSIC程程序序中中的的绝绝大大部部分分工工作作是是由由ANSIC标标准准库库中中的的printf,scanf完完成成的的,I/O功功能能作作为为ANSIC标标准准库库功功能能的的一一部部分分被被提提供供。在在C+中中iostream库库提提供供了了printf、scanf功功能能的的替替代代方方法法,输输入入输输出出功功能能的的实实现现由由一一个个iostream对象完成。对象完成。第5页,共42页,编辑于2022年,星期三1 流缓冲区类流缓
4、冲区类在在C+I/O类类库库定定义义文文件件iostream.h中中有有一一个个streambuf类类,它它用用来来提提供供物物理理设设备备的的接接口口。缓缓冲冲区区由由一一段段预预留留的的字字符符存存储储空空间间和和两两个个指指针针组组成成,两两个个指指针针分分别别指指向向字字符符要要被被插插入入或或被被取取出出的的位位置置。streambuf类类定定义义了了一一组组缓缓冲冲或或处处理理流流的的通通用用方方法法,诸诸如如设设置置缓缓冲冲区区,移移动动指指针针,存存、取取字字符符等。等。conbufconbufstrstreambufstrstreambuffilebuffilebufstre
5、ambuf图图11.1流缓冲区类的派生关系流缓冲区类的派生关系C+I/O流类流类的结构(的结构(1)第6页,共42页,编辑于2022年,星期三streambuf类有三个派生类,其中:类有三个派生类,其中:(1)conbuf在在constream.h中定义,提供光标控中定义,提供光标控制、清屏,定义活动窗口等控制台操作接口和制、清屏,定义活动窗口等控制台操作接口和I/O缓冲缓冲区管理功能。区管理功能。(2)filebuf在在fstream.h中定义,它用来维护文中定义,它用来维护文件缓冲区的打开,关闭,读、写,建立磁盘文件的内存件缓冲区的打开,关闭,读、写,建立磁盘文件的内存代理。代理。(3)s
6、trstreambuf在在strstream.h中定义,提供中定义,提供在内存进行提取和插入操作的缓冲区管理。在内存进行提取和插入操作的缓冲区管理。第7页,共42页,编辑于2022年,星期三2 输入输出流类输入输出流类iostream.h中中还还有有以以ios类类为为基基类类的的一一组组流流类类的定义。的定义。ios类类及及其其派派生生类类均均含含有有一一个个指指向向streambuf类类的指针。通过的指针。通过streambuf类代理物理设备的操作。类代理物理设备的操作。从从类类ios开开始始,逐逐级级派派生生,形形成成了了较较为为复复杂杂的的结结构构,要要很很好好地地使使用用C+流流类类,
7、必必须须逐逐级级了了解解其其父父类类的的public、和和protected类类型型的的成成员员函函数数、成成员变量。员变量。第8页,共42页,编辑于2022年,星期三istream_withassignistream_withassignostream_withassignostream_withassignstrstreambasestrstreambaseifstreamifstreamistrstreamistrstreamofstreamofstreamostrstreamostrstreamfstreamfstreamstrstreamstrstreamiostreamiostre
8、amiostream_ withassign iostream_ withassign istreamistreamostreamostreamfstreambasefstreambaseios图图11.2ios类的派生关系类的派生关系C+I/O流类流类的结构(的结构(2)第9页,共42页,编辑于2022年,星期三流类分类流类分类流类名称流类名称流类作用流类作用流基础类流基础类ios所有流类的父类、保存流的状态并处理错误所有流类的父类、保存流的状态并处理错误输入流类输入流类istream输输入入流流基基础础类类、将将流流缓缓冲冲区区中中的的字字符符作作格格式式化化和非格式化之间的转换,并输入。
9、和非格式化之间的转换,并输入。ifstream文件输入流类文件输入流类istream_withassign为为cin输入流类即操作符输入流类即操作符输入流输入流istrstream串输入流类串输入流类输出流类输出流类ostream输输出出流流的的基基础础类类、将将流流缓缓冲冲区区中中的的数数据据格格式式化化或非格式化转换,并输出。或非格式化转换,并输出。ofstream文件输出流类文件输出流类ostream_withassigncout,cerr,clog输出的流类即操作符输出的流类即操作符”“”进进行行了了重重载,用于完成对各种简单数据类型的输入和输出。载,用于完成对各种简单数据类型的输入和
10、输出。第13页,共42页,编辑于2022年,星期三11.2.2格式化的输入输出格式化的输入输出C+提提供供了了两两种种格格式式控控制制函函数数用用来来控控制制输输入入输输出出的格式:的格式:lios类中定义的类中定义的格式控制成员函数格式控制成员函数l基于流对象的基于流对象的操纵函数操纵函数。相相比比之之下下操操纵纵函函数数使使用用更更为为方方便便。下下面面重重点点介介绍绍操纵函数的概念和用法。操纵函数的概念和用法。第14页,共42页,编辑于2022年,星期三1ios 类中定义的格式控制标志类中定义的格式控制标志ios类类中中定定义义了了一一个个数数据据成成员员:格格式式控控制制标标志志字字l
11、ongx_flags。x_flags每每一位的状态值用枚举符号常量定义。一位的状态值用枚举符号常量定义。enumskipws=0 x0001,/跳过输入空格跳过输入空格left=0 x0002,/输出左对齐调整输出左对齐调整right=0 x0004,/输出右对齐调整输出右对齐调整internal=0 x0008,/输出符号和基指示符后的填补输出符号和基指示符后的填补dec=0 x0010,/转换为十进制转换为十进制(in/out)oct=0 x0020,/转换为八进制转换为八进制(in/out)hex=0 x0040,/转换为十六进制转换为十六进制(in/out)showbase=0 x00
12、80,/输出显示基指示符输出显示基指示符showpoint=0 x0100,/输出显示小数点输出显示小数点uppercase=0 x0200,/大写十六进制输出大写十六进制输出showpos=0 x0400,/正整数显示前加上正整数显示前加上”+”scientific=0 x0800,/输出用科学表示法表示浮点数输出用科学表示法表示浮点数fixed=0 x1000,/输出用固定小数点表示浮点数输出用固定小数点表示浮点数unitbuf=0 x2000,/在输出操作后刷新所有流在输出操作后刷新所有流stdio=0 x4000/在输出后刷新在输出后刷新stdout和和stderr;第15页,共42页
13、,编辑于2022年,星期三longx_flags=0 x0080=0000000010000000输出显示基指示符输出显示基指示符longx_flags=0 x0003=0000000000000011跳过输入空格跳过输入空格&输出左对齐调整输出左对齐调整longx_flags=0 x0083=0000000010000011跳过输入空格跳过输入空格&输出左对齐调整输出左对齐调整&输出显示基指示符输出显示基指示符longx_flags标志可以由标志可以由ios类的成员函数类的成员函数flags(),setf()和和unsetf()访问,也可以用操纵函数操作。访问,也可以用操纵函数操作。第16页
14、,共42页,编辑于2022年,星期三2操纵函数和操纵符操纵函数和操纵符操操纵纵函函数数分分为为带带参参数数和和不不带带参参数数两两种种。不不带带参参数数的的操操纵纵函函数数又又叫叫操操纵纵符符。操操纵纵符符定定义义在在头头文文件件iostream.h中中,操操纵纵函函数数定定义义在在头头文文件件iomanip.h中中.第17页,共42页,编辑于2022年,星期三表11.2iostream.h中的操纵符操作符操作符用法举例用法举例结果说明结果说明deccoutdecdecintvar;将整数转化为十进制格式输出将整数转化为十进制格式输出将整数转化为十进制格式输入将整数转化为十进制格式输入hexc
15、outhexhexintvar;将整数转化为十六进制格式输出将整数转化为十六进制格式输出将整数转化为十六进制格式输入将整数转化为十六进制格式输入octcoutoctoctintvar;将整数转化为八进制格式输出将整数转化为八进制格式输出将整数转化为八进制格式输入将整数转化为八进制格式输入wscinws;忽略输入流中的空格忽略输入流中的空格endlcoutendl;插入换行符插入换行符,刷新流刷新流endscoutends;插入串最后的串结束符插入串最后的串结束符flushcoutflush;刷新一个输入流刷新一个输入流第18页,共42页,编辑于2022年,星期三表表11.3iomanip.h中
16、的操纵函数中的操纵函数setprecision(int)coutsetprecision(15)输出浮点数精度为输出浮点数精度为6位小数位小数输入浮点数精度为输入浮点数精度为15位小数位小数setw(int)coutsetw(6)setw(24)buf;输出数据宽度为输出数据宽度为6输入数据宽度为输入数据宽度为24setiosflags(long)coutsetioflags(ios:oct|ios:skipws)指指定定数数据据输输出出的的格格式式为为十十六六进进制格式且用大写字母输出制格式且用大写字母输出指指定定数数据据输输入入的的格格式式为为八八进进制制格式且跳过输入中的空白格式且跳过输
17、入中的空白resetiosflags(long)coutresetiosflags(ios:hex)取取消消数数据据输输出出的的格格式式为为十十进进制制格式格式取取消消数数据据输输入入的的格格式式为为十十进进制制格式格式第19页,共42页,编辑于2022年,星期三例例11.1 操纵符的使用操纵符的使用#include#includevoidmain()doublevalues=1.23,35.36,653.7,4358.24;char*names=Zoot,Jimmy,Al,Stan;coutsetiosflags(ios:fixed);/浮点数使用普通记数法表示浮点数使用普通记数法表示for
18、(inti=0;i4;i+)coutsetiosflags(ios:left)/设置左对齐设置左对齐setw(6)/设置数据宽度为设置数据宽度为6位位namesiresetiosflags(ios:left)/撤消左对齐撤消左对齐setw(10)/设置数据宽度为设置数据宽度为10位位setprecision(1)/设置浮点数精度设置浮点数精度1位位valuesi”又又称称提提取取运运算算符符,流流的的输输出出运运算算符符”又称插入运算符,它们都可以重载。又称插入运算符,它们都可以重载。第21页,共42页,编辑于2022年,星期三例:用户定义的日期例:用户定义的日期Date类的输入输出。类的输入
19、输出。为保持和简单类型的输入输出同样的形式,为保持和简单类型的输入输出同样的形式,需要为需要为Date类重载操作符类重载操作符。由于重载的函数需要访问由于重载的函数需要访问Date类的私有的类的私有的和受保护的成员,应该把这些重载的函数定和受保护的成员,应该把这些重载的函数定义为义为Date类的友元。类的友元。第22页,共42页,编辑于2022年,星期三#includeclassDateintmo,da,yr;public:Date(intm,intd,inty)mo=m;da=d;yr=y;friendostream&operator(istream&is,Date&dt);ostream&
20、operator(ostream&os,Date&dt)osdt.mo/dt.da/(istream&is,Date&dt)isdt.modt.dadt.yr;returnis;/返回流的引用返回流的引用voidmain()intmo,da,yr;Datedt(7,1,1997);coutdtmodayr;Dateotherdt(mo,da,yr);coutotherdtdt_input;coutdt_inputendl;例例11.2 用户定义用户定义Date数据类中对流数据类中对流类运算符类运算符函数重载函数重载第23页,共42页,编辑于2022年,星期三重载操作符函数时应该注意以下几点重载
21、操作符函数时应该注意以下几点:重载的操作符函数有两个参数。重载的操作符函数有两个参数。如果重载的是输出操作符如果重载的是输出操作符,第一,第一个参数是对流个参数是对流istream类的引用。类的引用。第二个参数是要定义输入输出类的引用,也可以第二个参数是要定义输入输出类的引用,也可以是此类的指针。是此类的指针。运算符重载必须定义为类的友元,因为运算符重载必须定义为类的友元,因为左操作数必须是流类对象而不是输入左操作数必须是流类对象而不是输入/输出类输出类的对象,不能使用隐式左操作数。的对象,不能使用隐式左操作数。第24页,共42页,编辑于2022年,星期三#查询复杂程度复杂数据、有查询对象-关
22、系数据库(ORDB)简单数据、无查询文本文件简单数据、无查询面向对象数据库(OODB)简单数据、有查询关系式数据库(RDB)第25页,共42页,编辑于2022年,星期三11.4文件流与文件操作文件流与文件操作11.4.1C+标准库文件输入与输出标准库文件输入与输出标准的C+库提供了文件输入输出功能,它们是以函数的形式给出的。这里将对一些常用的函数如fopen、fclose、fwrite、fread等作简要说明。标准的C库对文件输入输出功能函数定义在stdio.h头文件中,并且定义了一个FILE型文件结构,在每一个文件被打开时,都有一个FILE型文件指针与之关联,以便保存文件的相关信息,完成文件
23、的读写操作。第26页,共42页,编辑于2022年,星期三对文件的操作一般分为三个步骤对文件的操作一般分为三个步骤:(1)使使用用文文件件打打开开函函数数对对文文件件进进行行打打开开,并与文件指针建立关系并与文件指针建立关系;(2)利利用用文文件件指指针针和和写写文文件件、读读文文件件函函数数对文件进行操作。对文件进行操作。(3)使用文件关闭函数,对文件关闭。)使用文件关闭函数,对文件关闭。第27页,共42页,编辑于2022年,星期三1 打开文件函数打开文件函数fopen完成文件操作第一步,可使用fopen函数,该函数定义为:FILE*fopen(const char*filename,cons
24、t char*mode);其中参数 filename是文件名字符串,mode为文件打开的模式。使用时注意:1).返回值是返回打开文件的指针,如果文件不存在或者不能找到文件,fopen调用返 回空指针(NULL)表示为文件打开失败。2).参数mode 可取以下值r 只读方式打开文件。w 写方式打开文件,如果文件已经存在,其文件中的内容被破坏。r+读和写的方式打开。(文件必须已经存在,否则将导致异常)w+读和写方式打开一空文件,如果该文件已经存在,其内容将被破坏。a+为了读文件和附加新内容而打开文件。t 以文本方式打开文件。b 二进制的方式打开文件。第28页,共42页,编辑于2022年,星期三2.
25、文件读写函数文件读写函数fread 和和fwrite完成第二步操作,就是要对文件进行读和写数据,一般常用fread读文件函数和fwrite函数,函数的使用格式为:size_tfread(void*buffer,size_tsize,size_tcount,FILE*stream);size_tfwrite(constvoid*buffer,size_tsize,size_tcount,FILE*stream);使用时注意:(1)fread函数读文件返回文件数据记录的数目;(2)fwrite函数返回实际写入文件数据记录的数目;(3)参数buffer指向数据缓冲区。fread函数将读出的数据放在缓
26、冲区中供程序使用;fwrite函数将写入文件的数据放在冲区中以便写入文件。(4)size为从文件读出和写入文件的字节数(5)count一次从文件读出数据的最大记录数和一次写入文件的最大记录数。(6)stream文件结构指针。fread函数为打开文件的针;fwrite函数为把数据要写入文件的指针。第29页,共42页,编辑于2022年,星期三3 关闭文件函数关闭文件函数fclose完成第三步操作可以使用fclose,其格式为:intfclose(FILE*stream);/关闭流文件(fclose)int_fcloseall(void);/关闭所有的流(_fcloseall)使用时注意:(1)fc
27、lose函数返回值为0时表示文件成功关闭,否则返回值为非0。(2)fcloseall成功关闭所打开的文件时,函数返回值为关闭文件的总数。(3)fclose函数的参数为指向FILE结构体的指针。第30页,共42页,编辑于2022年,星期三例例11.3 打开一个名为打开一个名为 FREAD.OUT 的文件并写入的文件并写入25 个字符个字符,然后将从文件中读出的字符然后将从文件中读出的字符#includevoidmain()FILE*stream;charlist30;inti,numread,numwritten;/文本模式打开文件并写数据if(stream=fopen(fread.out,w+
28、t)!=NULL)for(i=0;i25;i+)listi=(char)(z-i);numwritten=fwrite(list,sizeof(char),25,stream);printf(Wrote%ditemsn,numwritten);fclose(stream);elseprintf(Problemopeningthefilen);/*读出25个字符*/if(stream=fopen(fread.out,r+t)!=NULL)numread=fread(list,sizeof(char),25,stream);printf(Numberofitemsread=%dn,numread)
29、;printf(Contentsofbuffer=%.25sn,list);fclose(stream);elseprintf(Filecouldnotbeopenedn);输出:Wrote25itemsNumberofitemsread=25Contentsofbuffer=zyxwvutsrqponmlkjihgfedcb第31页,共42页,编辑于2022年,星期三11.4.2文件输入输出流文件输入输出流在C+中,对文件的输入输出操作提供了另一种操作方式,即流类库的文件操作,这些类是ofstream与ifstream文件输入输出流类。其对文件操作也需要上述的三个步骤。1.文件的输出文件的输
30、出文件的输出由ofstream完成,它由ostream类继承而来(见图11.2),并继承了它的操作,因此可以利用ostream重载的操作符函数和文件打开,从文件中读数据、关闭文件的函数。ifstream也提供了构造函数:ifstream();ifstream(constcahr_FAR*,int=ios:in,int=filebuf:openprot);第37页,共42页,编辑于2022年,星期三1).文件的打开第一个构造函数用于构造一个不带参数的流,如果需要可以在用它的open函数打开一个文件,下面是open函数的定义:voidopen(constsignedchar_FAR*,int=io
31、s:in,int=filebuf:openprot);它和第二构造函数的使用同文件的输入中的文件打开。2).文件的数据读出函数可以使用istream类的写数据的函数和操作符把数据写入文件,操作符函数在前面已经介绍,这里实现写数据的函数是:class_CRTIMPistream:virtualpubliciospublic:/读取文件数据到字符串内inlineistream&get(char*,int,char=n);inlineistream&get(unsignedchar*,int,char=n);inlineistream&get(signedchar*,int,char=n);/读取文
32、件数据到字符内istream&get(char&);inlineistream&get(unsignedchar&);inlineistream&get(signedchar&);istream&get(streambuf&,char=n);/读取文件一行数据到字符串内inlineistream&getline(char*,int,char=n);inlineistream&getline(unsignedchar*,int,char=n);inlineistream&getline(signedchar*,int,char=n);inlineistream&ignore(int=1,int=
33、EOF);/读取文件数据到字符串内istream&read(char*,int);inlineistream&read(unsignedchar*,int);inlineistream&read(signedchar*,int);intgcount()constreturnx_gcount;intpeek();istream&putback(char);intsync();/移动输入文件指针位置istream&seekg(streampos);istream&seekg(streamoff,ios:seek_dir);/读取当前输入文件指针位置的值streampostellg();第38页,共
34、42页,编辑于2022年,星期三3).文件的关闭函数ifstream类也是从fstreambase类继承的,可以使用fstreambase类的close();来关闭文件。第39页,共42页,编辑于2022年,星期三例例11.4使用使用istream和和ostream类的文件操作函数把一个文件类的文件操作函数把一个文件file.in的内容拷贝到另一个文件的内容拷贝到另一个文件file.out。#include#include#includevoidmain()charch;ifstreamfin(“file.in”);/创建一个输入流,并和输入文件file.in联系ofstreamfout(“f
35、ile.out”);/创建一输出流,并和输出文件file.out联系if(!fin)cerr”Cannotopenfilefile.in”;exit(-1);/如果原文件出错,显示信息并退出if(!fout)cerr”Cantopenfilefile.out”;exit(-1);/如果目的文件出错,显示信息并退出while(fout&fin.get(ch)fout.put(ch);第40页,共42页,编辑于2022年,星期三例例11.5 利利用用istream和和ostream类类的的操操作作符符对对点点数数据据进进行行文文件件操操作作,从从键键盘盘上上输输入入两两个个点点的的坐坐标标,把把它
36、它保保存存到到磁磁盘盘文文件件上上,并并从从磁磁盘盘上上读读出出数数据,写到显示器上。据,写到显示器上。#include#include#include#include#include#includeclassPointprotected:intX;intY;public:Point(intx,inty)X=x;Y=y;friendostream&operator(istream&is,Point&aPoint);ostream&operator(ostream&os,Point&aPoint)os(aPoint.X,aPoint.Y(istream&is,Point&aPoint)isaPo
37、int.XaPoint.Y;returnis;/返回流的引用intmain()intx,y;ofstreamwritefile(cstest.sav);/创建一个文件流if(!writefile)/如果创建失败,退出coutCantopenfile;exit(-1);coutxy;/标准输入流输入数据PointPoint1(x,y);/创建点对象coutxy;/标准输入流输入数据PointPoint2(x,y);/创建点对象writefilePoint1;/把第一个点存入文件writefilePoint2;/把第二个点存入文件writefile.close();ifstreamreadfile(ctest.sav);/创建一个输入文件流if(!readfile)/如果创建失败,退出,coutPoint1Point2;/把文件的数据读入点对象coutPoint1endl;/将第一个点对象写在显示器上coutPoint2endl;/将第二个点对象写在显示器上return0;第41页,共42页,编辑于2022年,星期三第42页,共42页,编辑于2022年,星期三