输入输出流与流类库



《输入输出流与流类库》由会员分享,可在线阅读,更多相关《输入输出流与流类库(99页珍藏版)》请在装配图网上搜索。
1、,,,单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,*,,*,/99,面向对象程序设计(,C++,描述),成信院,第,二,章,输入输出流与流类库,*,2,/99,本章主要内容,流的定义、,C++,的预定义流,,标准输入输出的预定义流对象,cin,、,cout,、,cerr,和,clog,,格式化的,I/O,,输入流,/,输出流专门操作,,,文件与文件流,,文件操作:打开和关闭、文件的定位与随机存取、文件的读写,,*,3,/99,I/O,流的概念,当程序与外界环境进行信息交换时,存在着两种对象,一种是,程序中的对象,,另一种是,文件对象,。,,流
2、是一种抽象,,它负责在数据的,生产者,和数据的,消费者,之间建立联系,并管理数据的流动。把数据的流动称为,流,。流在使用前要被建立,使用后要被删除,还要使用一些特定的操作,从流中获取数据或向流中添加数据。读操作在流数据抽象中被称为(从流中),提取,即输出,,写操作被称为(向流中),插入,即输入,。,,程序建立一个,流对象,,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。,,*,4,/99,iostream,类库概述,输入,/,输出操作在,C,和,C++,中没有定义,所有的,C++,编译器绑定了,iostream,类,用于,I/O,操作。在
3、,iostream,类中,,“,流,(stream),”,是其核心概念。我们可以认为流对象就象一个,“,杰出的文件,”,,是,字节数据出入的源和目的地,。,,*,5,/99,iostream,类库中各类间的关系图,iostream,类库概述,,*,6,/99,ios,类,ios,类用来提供流的高级,I/O,操作。它是一个,虚基类,。提供输入输出所需的公共操作。,ios,类包含一个指向,streambuf,的指针,提供格式化标志进行格式化,I/O,处理,对,I/O,的错误处理,设置文件模式以及提供建立相关流的方法。,iostream,类库概述,,*,7,/99,streambuf,类,strea
4、mbuf,类主要负责缓冲区的处理。它提供对缓冲区的低级操作,如设置缓冲区,对缓冲区指针进行操作,从缓冲区提取字节,向缓冲区插入字节等,,filebuf,,,strstreambuf,和,stdiobuf,都是,streambuf,的派生类,,filebuf,提供文件缓冲区的管理,,strstreambuf,使用字符串保存字符序列,提供在内存中提取和插入操作的缓冲区管理,,stdiobuf,提供标准,I/O,文件的缓冲区管理,,iostream,类库概述,,*,8,/99,ostream,类及其派生类提供流的各种格式化、非格式化操作,对所有系统预定义的,输出流,重载运算符,“,<<,”,。它有,
5、3,个派生类:,,ofstream,文件输出流类,,ostrstream,串输出流类,,ostream,_,withassign,为标准输出流,cout,,,cerr,, clog,定义的输入流类,重载了赋值运算符,iostream,类库概述,,ostream,类及其派生类,*,9,/99,istream,类及其派生类提供流的大部分输入操作。主要有对,streambuf,进行插入时格式化、非格式化的转换,并对所有系统预定义的,输入流,重载运算符,“,>>,”,,它有,3,个派生类:,,ifstream,文件输入流类,用于对文件的提取操作,,istrstream,串输出流类,用于对字符串的提取操
6、作,,istream,_,withassign,为标准输入流,cin,定义的输入流类,重载了赋值运算符。,iostream,类库概述,,istream,类及其派生类,*,10,/99,iostream,由,istream,和,ostream,派生而来,综合了流的输入输出操作。它有,3,个派生类:,,文件输入输出流类,fstream,,串输入输出流类,strstream,,标准输入输出流类,stdiostream,,ios,类中的很多,操纵符(以一个流引用作为其参数,并返回同一流的引用,故它可以嵌入到输入,/,输出操作的链中),都可以应用于输入流。,,操作符是在头文件,iostream,.h,中
7、定义的,,,而操作函数是在,iomanip,.h,中定义,。,iostream,类库概述,,输入输出流类,iostream,*,11,/99,屏 幕 输 出,方法,1,:,输出流,,使用预定义的,插入(,<<,)运算符,(,ostream,类中定义的运算符),,是所有,标准,C++,数据类型预先设计的,,最重要的三个输出流是,,ostream,,ofstream,,ostringstream,屏幕输出和键盘输入,,*,12,/99,屏 幕 输 出,预先定义的输出流对象,:,,cout,标准输出,,cerr,标准错误输出,没有缓冲,发送给它的内容立即被输出。,,clog,类似于,cerr,,但是
8、有缓冲,缓冲区满时被输出。,屏幕输出和键盘输入,,*,13,/99,屏 幕 输 出,格式:,,,,ostream,&,operator <<( char,ch,);,,,ostream,&,operator <<( unsigned char,uch,);,ostream,&,operator <<( signed char,sch,);,ostream,&,operator <<( const char*,psz,);,ostream,&,operator <<( const unsigned char*,pusz,);,,,ostream,&,operator <<( const sign
9、ed char*,pssz,);,,,,ostream,&,operator <<( short s );,,,ostream,&,operator <<( unsigned short us );,,,ostream,&,operator <<(,int,n );,,屏幕输出和键盘输入,,*,14,/99,,ostream,&,operator <<( unsigned,int,un );,,,ostream,&,operator <<( long l );,,,ostream,&,operator <<( unsigned long,ul,);,,,ostream,&,operator <
10、<( float f );,,,ostream,&,operator <<( double d );,,,ostream,&,operator <<( long double ld ); (16-bit only),,,ostream,&,operator <<( const void*,pv,);,,,ostream,&,operator <<(,streambuf,*,psb,);,,,ostream,&,operator <<(,ostream,& (*,fcn,)(,ostream,,,,ostream,&,operator <<(,ios,& (*,fcn,)(,ios,,,,,功能
11、:重载的操作符把对应的参数插入到输出流中,*,15,/99,屏 幕 输 出,方法,2,:,,使用成员函数,put( ),,,,格式:,ostream,&,put( char,ch,);,,功能:把一个字符插入到输出流中,,方法,3,:,,使用成员函数,write( ),,,,格式:,,,ostream,&,write( const char*,pch,,,int nCount,);,,,ostream,&,write( const unsigned char*,puch,,,int nCount,);,,,ostream,&,write( const signed char*,psch,,,i
12、nt nCount,);,屏幕输出和键盘输入,,*,16,/99,功能:从一缓冲区中把指定数量的字节数插入到输出流中。,,,,[,例,1],,,#include <,iostream,>,,using namespace std;,,,viod,main( ),,{,,,int,a = 12;,,,cout,<<,a << "123";,,,cout,.put( 'a' ).put( 'b' ).put( 'c' ).put( '\n' );,,,cout,.write( ",abcde,", 2 ).write( ",qwer,", 2 );,,},,*,17,/99,提取运算符(,>>,)
13、,提取运算符,(>>),对于所有,标准,C++,数据类型都是预先设计好的。,cin,标准输入。,,是从一个输入流对象获取字节最容易的方法。,,ios,类中的很多,操纵符,都可以应用于输入流。但是只有少数几个对输入流对象具有实际影响,其中最重要的是进制操纵符,dec,、,oct,和,hex,。,屏幕输出和键盘输入,,*,18,/99,输入流成员函数,open(),函数把该流与一个特定磁盘文件相关联。,,get(),函数的功能与,提取运算符(,>>,),很相像,主要的不同点是,get,函数在读入数据时,包括空白字符。,,getline,(),的功能是从输入流中读取多个字符,并且允许指定输入终止字符
14、,读取完成后,从读取的内容中删除终止字符。,,read(),成员函数从一个文件读字节到一个指定的内存区域,由长度参数确定要读的字节数。如果给出长度参数,当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时结束读取。,屏幕输出和键盘输入,,*,19,/99,输入流成员函数,seekg,(),函数用来,设置,输入文件流中,读取数据位置的指针,,,tellg,(),函数,返回当前文件读指针的位置,,,close(),函数关闭与一个输入文件流关联的磁盘文件,屏幕输出和键盘输入,,*,20,/99,键 盘 输 入,方法,1,:,输入流,,重要的输入流类:,,istream,类最适合用于顺序文本模式输
15、入;,cin,是,其派生类,istream,_,withassign,的对象,,ifstream,类支持磁盘文件输入,,istringstream,屏幕输出和键盘输入,,*,21,/99,键 盘 输 入,使用,提取运算符(,>>,),的格式:,,,istream,&,operator >>( char*,psz,);,,,istream,&,operator >>( unsigned char*,pusz,);,,,istream,&,operator >>( signed char*,pssz,);,,,istream,&,operator >>( char&,rch,);,,,istrea
16、m,&,operator >>( unsigned char&,ruch,);,,,istream,&,operator >>( signed char&,rsch,);,,,istream,&,operator >>( short,,,istream,&,operator >>( unsigned short,,,istream,&,operator >>(,int,,屏幕输出和键盘输入,,*,22,/99,,istream,&,operator >>( unsigned,int,,,,istream,&,operator >>( long,,,istream,&,operator >>(
17、unsigned long&,ul,);,,,istream,&,operator >>( float,,,istream,&,operator >>( double,,,istream,&,operator >>(long double (16-bit only),,,istream,&,operator >>(,streambuf,*,psb,);,,,istream,&,operator >>(,istream,& (*,fcn,)(,istream,,,,istream,&,operator >>(,ios,& (*,fcn,)(,ios,,,,,功能: 从流对象中提取数据。,*,23
18、,/99,键 盘 输 入,方法,2,:,,使用成员函数,get( ),,,,格式:,,,int,get();,,,istream,&,get( char*,pch,,,int nCount,, char,delim,= '\n' );,,,istream,&,get( unsigned char*,puch,,,int nCount,, char,delim,= '\n' );,,,istream,&,get( signed char*,psch,,,int nCount,, char,delim,= '\n' );,,,istream,&,get( char&,rch,);,,,istrea
19、m,&,get( unsigned char&,ruch,);,,,istream,&,get( signed char&,rsch,);,,*,24,/99,,get(),函数功能:,,,int,get(),不带参数的函数,get,从指定的输入流中提取一个 字符(包括空白字符,),,并返回该字符作为函数调用的值。当遇到文件结束 符时,返回系统常量,EOF,,,istream,& get(char&,rch,),从指定输入流中提取一个字符(包括空白字符),把该字符写入,rch,引用的对象。当遇到文件结束符时,该函数返回,0,,否则返回对,istream,对象的引用,,,istream,& g
20、et(char *,pch,,,int nCount,, char,delim,=,‘,\n,’,),从当前字符开始,读取,nCount,-1,个字符,或遇到指定分隔符,delim,结束。函数把读取的字符(不包括分隔符)写入数组,pch,中,并在字符串后添加,‘,,\0,’,*,25,/99,方法,3,:,,使用成员函数,read( ),,,,格式:,,,istream,&,read( char*,pch,,,int nCount,);,,,istream,&,read( unsigned char*,puch,,,int nCount,);,,,istream,&,read( signed
21、char*,psch,,,int nCount,);,,功能:从流读出的字节序列赋给,pch,(,地址,),所指内存字节序列,参数,nCount,指定提取字节数。,键 盘 输 入,,*,26,/99,[,例,2],,#include <,iostream,>,,using namespace std;,,void main(),,{,,,int,a;,,char p[11];,,,cin,>> a,;,,,cin,.get(p,10,'a');,,,cout,<< a <<,endl,;,,//,endl,相当于,," \n ",,,cout,<< p <<,endl,;,,,cin,.rea
22、d(p, 4); //,从输入流当前位置读取,4,个字节,写入到,p,中,,,cout,<< p <<,endl,;,,},因为,endl,包含在,std,中,所以如果用了,using namespace std,,那么就不用加头文件了。,为什么此处使用操纵符,“,endl,”,时不用包含,“,iomanip,.h",头文件,?,*,27,/99,输 出 宽 度,为满足用户对数据输入输出的格式化需要,,ios,提供直接设置标志字的控制格式函数,,为了调整输出,可通过在流中放入,setw,操纵符或调用,width,成员函数为每个项指定输出宽度,,int,width(,int nw,),设置下一
23、个输出项的显示宽度为,nw,。如果,nw,大于数据所需宽度,在没有特别指示时,数据以右对齐方式显示。,如果,nw,小于数据所需宽度,则,nw,无效,数据以默认格式输出,。该函数设置,没有持续性,,输出一个项目后,恢复系统的默认设置,格式控制,,*,28,/99,[,例,3],使用,width,控制输出宽度,,#include <,iostream,>,,using namespace std;,,int,main(),,{,,double values[ ] = { 1.23, 35.36, 653.7, 4358.24 };,,for(,int,i = 0; i < 4; i++ ),,{,
24、,,cout,.width(10);,,,cout,<< values[i] << '\n';,,},,},The output looks like this:,,1.23,,35.36,,653.7,,4358.24,*,29,/99,设置填充字符函数,char fill(char,cFill,),当设置宽度大于数据显示需要宽度时,空白位置以字符参数,cFill,填充。若数据 在宽度域左对齐,在数据右边填充,否则在左边填充。,默认填充符为空白符,。,,,如果要在同一行上为输出的数据设置宽度可以使用,setw,(),函数,该函数在,iomanip,.h,文件,中做了声明,在使用该函数时,必须
25、包括该头文件。,设置填充字符和设置显示宽度,格式控制,,*,30,/99,[,例,4],使用*填充,,#include <,iostream,>,,using namespace std;,,void main(),,{,,double values[ ] = { 1.23, 35.36, 653.7, 4358.24 };,,for(,int,i = 0; i < 4; i++ ),,{,,,cout,.width( 10 );,,,cout,.fill( '*' );,,,cout,<< values[i] <<,endl,;,,},,},The output looks like thi
26、s:,,******1.23,,*****35.36,,*****653.7,,***4358.24,*,31,/99,[,例,5],使用,setw,指定宽度,,#include <,iostream,>,,#include <,iomanip,>,,using namespace std;,,void main(),,{,,double values[ ] = { 1.23, 35.36, 653.7, 4358.24 };,,char *names[ ] = { ",Zoot,", "Jimmy", "Al", "Stan" };,,for(,int,i = 0; i < 4; i++ )
27、,,,cout,<<,setw,( 6 ) << names[i],,<<,setw,( 10 ) << values[i] <<,endl,;,,},The output looks like this:,,,,Zoot,1.23,,Jimmy 35.36,,Al 653.7,,Stan 4358.24,*,32,/99,输出对齐默认是右对齐文本,,如果要左对齐文本,可以使用,setiosflags,(,ios,::,lFlags,),函数,,,参数传入,ios,类中数据成员,ios,::left,,为使前面例子中,name,中的字符串左对齐,,value
28、,中的数值右对齐。修改循环段的内容如下:,,,for (,int,i = 0; i < 4; i++ ),,,cout,<<,setiosflags,(,ios,::left ),,<<,setw,( 6 ) << names[i],,<<,resetiosflags,(,ios,::left ),,,/*,清除原有设置*,/,,<<,setw,( 10 ) << values[i] <<,endl,;,,输 出 对 齐,格式控制,,输出结果如下:,,,Zoot,1.23,,Jimmy 35.36,,Al 653.7,,Stan 4358.24,
29、,,*,33,/99,在,ios,类中声明了一个数据成员,用于记,录当前流的格式化状态,,这个数据成员称为,标志字,。标志字的每一位用于记录一种格式。为便于记忆,每一种格式定义了对应的,枚举常量,。上例中只是使用了,ios,类中标志字,ios,::left,,下表列出了常用的标志常量名及意义:,标志常量,值,意义,输入,/,输出,ios,::,skipws,0x0001,跳过输入中的空白,I,ios,::left,0x0002,按输出域左对齐输出,O,ios,:right,0x0004,按输出域右对齐输出,O,ios,::internal,0x0008,在符号位或基指示符后填入字符,O,ios
30、,::,dec,0x0010,转换基制为十进制,I/O,ios,::,oct,0x0020,转换基制为八进制,I/O,ios,::hex,0x0040,转换基制为十六进制,I/O,ios,::,showbase,0x0080,输出显示基指示符,O,ios,::,showpoint,0x0100,输出显示小数点,O,*,34,/99,标志常量,值,意义,输入,/,输出,os,::uppercase,0x0200,十六进制输出时一律用大写字母,O,ios,::,showpos,0x0400,正整数前加“,+”,号,O,ios,::scientific,0x0800,科学示数法显示浮点数,O,ios
31、,::fixed,0x1000,定点形式显示浮点数,O,ios,::,unitbuf,0x2000,插入操作后立即刷新流,O,ios,::,stdio,0x4000,插入操作后刷新,stdout,和,stderr,O,*,35,/99,设置显示精度,系统提供显示精度的默认值是,6,。,float,类型最大设置示数精度是,6,位,,double,类型最大设置示数精度是,15,位 。我们可以根据需要设置示数精度,,修改上例中循环部分内容如下:,,for (,int,i = 0; i < 4; i++ ),,,cout,<<,setiosflags,(,ios,::left ),,<<,setw,(
32、 6 ),,<< names[i],,<<,resetiosflags,(,ios,::left ) /*,清除原有设置*,/,,<<,setw,( 10 ),,<<,setprecision,( 1 ),,<< values[i],,<<,endl,;,格式控制,输出结果如下:,,Zoot,1,,Jimmy 4e+001,,Al 7e+002,,Stan 4e+003,,*,36,/99,[,例,6],控制输出精度,,#include <,iostream,>,,#include <,iomanip,>,,using namespace std;,,int,ma
33、in(),,{,,double values[ ]={1.23,35.36,653.7,4358.24};,,char *names[ ]={",Zoot,","Jimmy","Al","Stan"};,,,cout,<<,setiosflags,(,ios,::scientific);,,for(,int,i=0;i<4;i++),,,cout,<<,setiosflags,(,ios,::left),,<<,setw,(6)< 34、es[i]<<,endl,;,,},The output looks like this:,,,Zoot,1.2e+000,,Jimmy 3.5e+001,,Al 6.5e+002,,Stan 4.4e+003,*,37,/99,进 制,dec,、,oct,和,hex,操纵符设置输入和输出的缺省进制,格式控制,,*,38,/99,文件(,files,),文件,(File),是一个物理概念,,代表存储着信息集合的某个,外部介质,,它是,C++,语言,对具体设备的抽象,。如磁盘文件,显示器,键盘。,,所有流,(,类对象,),的行为都是相同的,而不同的文件 35、则可能具有不同的行为。如,磁盘文件可进行写也可进行读操作;显示器文件则只可进行写操作;而键盘文件只可进行读操作。,,当程序与一个文件交换信息时,必须通过,“,打开文件,”,的操作将一个文件与一个流,(,类对象,),联系起来。一旦建立了这种联系,以后对该流,(,类对象,),的访问就是对该文件的访问,也就是对一个具体设备的访问。可通过,“,关闭文件,”,的操作将一个文件与流,(,类对象,),的联系断开。,磁盘文件,,*,39,/99,文件操作处理流程,打开文件,,,读写操作,,,关闭文件,磁盘文件,,,,*,40,/99,C++,文件流系统,在头文件,“,fstream,.h,”,中说明,(,预定 36、义,),了,一批文件流类,,专用于,磁盘文件,:,,ifstream,--,由,istream,派生,支持从磁盘文件中输入,(,读入,),数据;,,ofstream,--,由,ostream,派生,支持往磁盘文件中输出,(,写出,),数据;,,fstream,,--,由,iostream,派生,支持对磁盘文件进行输入和输出数据的双向操作。,,,,C++,中没有预定义的文件流,(,类对象,),,程序中用到的所有,文件流类对象,都要进行自定义。,磁盘文件,,*,41,/99,输出文件流成员函数,输出流成员函数有三种类型:,,与操纵符等价的成员函数,,执行非格式化写操作的成员函数,,其它修改流状态且 37、不同于操纵符或插入运算符的成员函数,磁盘文件,,*,42,/99,输出文件流成员函数,open(),函数,,把流与一个特定的磁盘文件关联起来,,需要指定打开模式,,put(),函数,,把一个字符写到输出流中,,write(),函数,,把内存中的一块内容写到一个输出文件流中,,seekp,(),和,tellp,(),函数,,操作文件流的内部指针,,close(),函数,,关闭与一个输出文件流关联的磁盘文件,,错误处理函数,,在写到一个流时进行错误处理,磁盘文件,,*,43,/99,文件的打开与关闭,磁盘文件的操作可使用文件流类,ifstream,、,ofstream,或,fstream,类的成员 38、函数来完成。如果以读的方式打开文件,应使用,ifstream,;如果以写的方式打开文件,应使用,ofstream,;如果以读,/,写的方式打开文件,应使用,fstream,,操作过程如下:首先说明一个文件流类的对象,然后用成员函数,open(),打开文件,再使用成员函数对文件进行读,/,写操作,最后使用成员函数,close(),关闭文件,,ofstream,类支持磁盘文件输出,,如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的:,,ofstream myFile,("filename",,iosmode,);,,,磁盘文件,,*,44,/99,文件的打开与关闭,在调用默认构造 39、函数后使用,open,成员函数打开文件:,,//,声明一个静态输出文件流对象,,ofstream myFile,;,,//,打开文件,使流对象与文件建立联系,,myFile,.open("filename",,iosmode,);,,,//,建立一个动态的输出文件流对象,,ofstream,*,pmyFile,= new,ofstream,;,,//,打开文件,使流对象与文件建立联系,,pmyFile,->open("filename",,iosmode,);,,,注意:,fstream,派生于,ifstream,和,ofstream,,所以继承了它们的接口函数。以下示例都以,fstream, 40、为例。,,,磁盘文件,,*,45,/99,格式:,1,、,<,文件对象名,>.open(<,文件名,>,,,<,打开方式,>);,,2,、,文件流,<,对象名,>(<,文件名,>, <,打开方式,>);,,打开方式,:,,,ios,::in,读方式打开,,,ios,:: out,写方式打开,,,ios,:: app,追加方式,,,ios,:: ate,文件打开时,文件指针位于文件尾,,,ios,::,trunc,如果文件存在,清除原有内容。若文件,,不存在,则创建,,,ios,:: binary,以二进制方式打开文件,,,ios,::,nocreate,打开已有的文件,如果文件不存在,则,, 41、打开失败,,,ios,::,noreplace,如果文件存在,除非设置,ios,::ate,或,,,ios,::app,,,否则打开失败,磁盘文件,文件的打开,,*,46,/99,“,打开文件,”,通常通过,构造函数,自动完成(也可,显式调用成员函数,open,完成)。,“,关闭文件,”,通常通过使用,“,<,流类对象名,>.close();,”,来,显式完成,。,,例,1:,ofstream,outfile1("myfile1.txt");,,,,创建,ofstream,类的对象,outfile1,;使流类对象,outfile1,与磁盘文件,"myfile1.txt",相联系;并打开用于,“ 42、,写,”,的磁盘文件,"myfile1.txt",。,,,例,2:,//,创建,ofstream,类的对象,outfile1,,,ofstream,outfile1;,,,,,//,显式调用成员函数,open,来打开文件,,,outfile1.open("myfile1.txt");,文件的打开,,*,47,/99,1.,ifstream,::,ifstream,,ifstream,( const char*,szName,,,int nMode,=,ios,::in,,,,int nProt,=,filebuf,::,openprot,);,,,,参数,:,,(1),szName,:文件名; 43、,,,,(2),nMode,:打开文件的方式。,,,ios,::in,,,以读,(,输入,),为目的打开。,,,ios,::,nocreate,,,仅打开一个已存在文件。,,,ios,::binary,,,打开二进制文件。,,,,(3),nProt,:指定所打开文件的保护方式。,,,,,filebuf,::,openprot,表示兼容共享方式。,与创建流类对象相关的三个构造函数,,*,48,/99,2.,ofstream,::,ofstream,,,ofstream,( const char*,szName,,,int nMode,=,ios,::out,,,,int nProt,=,file 44、buf,::,openprot,);,,,,参数,:,,(1),szName,:文件名;,,,,(2),nMode,:打开文件的方式。,,,,ios,::out,,,以写,(,输出,),为目的打开文件。,,,ios,::,trunc,,若文件存在,则将文件长度截为,0,。,,,ios,::binary,,打开二进制文件。,,,ios,::app,,,以追加方式打开。,,,...,,,,(3),nProt,:指定所打开文件的保护方式。,,,与创建流类对象相关的三个构造函数,*,49,/99,,3.,fstream,::,fstream,,,,,fstream,( const char*,szNa 45、me,,,int nMode,,,,,int nProt,=,filebuf,::,openprot,);,,,,,,说明:参数含义和用法与,ofstream,构造函数处相同。,,与创建流类对象相关的三个构造函数,*,50,/99,,,1.,ofstream,::open,,,void open( const char*,szName,,,int nMode,=,ios,::out,,,,int nProt,=,filebuf,::,openprot,);,,,,2.,ifstream,::open,,,void open( const char*,szName,,,int nMode,=,i 46、os,::in,,,,int nProt,=,filebuf,::,openprot,);,,,,3.,fstream,::open,,,void open( const char*,szName,,,int nMode,,,,,int nProt,=,filebuf,::,openprot,);,与创建流类对象相关的三个,open,函数,,*,51,/99,例如:,,,#include <,fstream,>,,,fstream,f1;,,f1.open( ",my,file,.,dat,",,ios,::out);,,或,:,,,fstream,f1( ",myfile,.,dat,",, 47、ios,::out);,,关闭文件的格式如下:,,,<,文件对象名,>.close( );,,,例如:,f1.close( );,磁盘文件,文件的打开与关闭,,*,52,/99,,对文件的,“,读写操作,”,通常使用预定义的,类成员函数,来实现(随后介绍),但也可使用继承而来的,插入和提取运算符,“,>>,”,和,“,<<,”,来进行,这基于如下的事实:,,,ifstream,类由,istream,类所派生,,而,istream,类中预定义了公有的运算符,重载函数,“,operator >>,”,,所以,,ifstream,流(类对象)可以使用预定义的算符,“,>>,”,来对自定义磁盘文件进行 48、,“,读,”,操作(允许通过派生类对象直接调用其基类的公有成员函数);,,,,ofstream,类由,ostream,类所派生,,而,ostream,类中预定义了公有的运算符,重载函数,“,operator <<,”,,所以,,ofstream,流(类对象)可以使用预定义的算符,“,<<,”,来对自定义磁盘文件进行,“,写,”,操作;,读写操作,,*,53,/99,,,,fstream,类由,iostream,所派生,,,iostream,类由,istream,与,ostream,类共同派生,所以,,fstream,流(类对象)可以使用,预定义的运算符,“,>>,”,和,“,<<,”,来对自定 49、义磁盘文件进行,“,读,”,与,“,写,”,操作。,,,还有一点需要注意:使用预定义的算符,“,<<,”,来进行,“,写,”,操作时,为了今后能正确读出,,数据间要人为地添加分隔符,(比如空格),这与用算符,“,>>,”,来进行,“,读,”,操作时遇空格或换行均结束一个数据相呼应。,,下述示例程序做了如下,3,件事:,1),往文件写数据;,2),往文件尾部追加数据;,3),从文件读出数据并显示在屏幕上。,读写操作,,*,54,/99,#include <,fstream,>,,int,main() {,,,//1),往文件写数据,,,ofstream,outfile1(“myfile1.txt 50、”);,//,,以,“,写,”,方式打开,,,outfile1,,<<,,“Hello!...CHINA! CUIT”,,<<,,endl,;,,outfile1.close();,,,,//2),往文件尾部追加数据,,,outfile1.open(“myfile1.txt”,,,,ios,::app,);,//,,以,“,追加,”,方式打开,,,int,x,,=,,1212,,,y,,=,,6868;,,outfile1< 51、,,char str1[80], str2[80];,,,int,x2,,=,,0,,,y2,,=,,0;,,,ifstream,infile1(“myfile1.txt”);,//,,以,“,读,”,方式打开,,,infile1,,>>,,str1,,>>,,str2;,,,//,,使用,“,>>,”,读,(,遇空格、换行均结束,),,infile1,,>>,,x2,,>>,,y2;,,infile1.close();,*,55,/99,,cout,,<<,,“str1=”,,<<,,str1,,<<,,endl,;,,,cout,,<<,,“str2=”,,<<,,str2,,<<,,en 52、dl,;,,,cout,,<<,,“x2=”,,<<,,x2,,<<,,endl,;,,,cout,,<<,,“y2=”,,<<,,y2,,<<,,endl,;,,},,//,程序执行后的显示结果如下:,,str1=Hello!...CHINA!,,str2=CUIT,,x2=1212,,y2=6868,*,56,/99,1,类成员函数,get,与,put,,2,类成员函数,read,与,write,,3,类成员函数,getline,,使用类成员函数对文件流进行操作,,*,57,/99,ostream,& put( char,ch,);,,,功能:将字符,ch,写到自定义文件中。,,,,ist 53、ream,& get( char&,rch,);,,功能:从自定义文件中读出,1,个字符放入引用,rch,中。,,,注意,,put,实际上只是,ostream,类中定义的公有成员函数,当然通过其派生类,ofstream,的类对象也可以直接对它进行调用。同理,通过,ifstream,的类对象可以直接调用,get,。,用类成员函数,get,与,put,,*,58,/99,[,程序示例,],,从键盘输入任一个字符串,通过,put,将其写到自定义磁盘文件,“,putgetfile,.txt,”,中,而后再使用,get,从该文件中读出所写串并显示在屏幕上,。,,,#include <,fstream, 54、>,,#include <,stdio,>,,void main() {,//,键盘输入字符串,通过,put,将其写到自定义磁盘文件中,,,char,str,[80];,,,cout,<< "Input string: " <<,endl,;,,gets(,str,);,,,ofstream fout,( ",putgetfile,.txt" );,,,int,i = 0;,,while (,str,[i] ),,,fout,.put(,str,[i++]);,,,fout,.close();,,,cout,<< "--------------------" <<,endl,;,*,59,/ 55、99,,//,而后使用,get,从文件中读出该串显示在屏幕上,,,char,ch,;,,,ifstream,fin( ",putgetfile,.txt" );,,fin.get(,ch,);,,while( !fin.,eof,() ){,,,//,从头读到文件结束,(,当前符号非文件结束符时继续,),,//,注,:,成员函数,eof,(),在读到文件结束时方返回,true,,,cout,,<<,,ch,;,,fin.get(,ch,);,,},,,cout,,<<,,endl,;,,fin.close();,,},,//,程序执行后的显示结果如下:,,Input string:,,File 56、 operating -- using 'put' and 'get', OK! 12345,,--------------------------------------------------,,File operating -- using 'put' and 'get', OK! 12345,*,60,/99,,[,程序示例,],对指定文件进行拷贝,,,使用类成员函数,get,与,put,对指定文件进行拷贝。被拷贝的,“,源文件,”,以及拷贝到的,“,目的文件,”,的名字与路径均由命令行参数来提供。,,,,,程序执行结果,(,若提供的命令行参数为,:,mycopy,.,cpp res, 57、_1.,cpp,):,,,Copy file from ',mycopy,.,cpp,' to ',res,_1.,cpp,',,,,,,程序执行结果,(,若提供的命令行参数个数不对时,):,,,ERROR ! -- supplying 2 command-line,argements,?!,*,61,/99,,#include <,fstream,>,,void main(,int argc,, char*,argv,[]){,,if(,argc,,!=,,3) {,//,,命令行参数个数不对时,,,cout,,<<,,"ERROR ! -- supplying 2 command-line 58、,argements,?! ",,<<,,endl,;,,exit (1);,,},,,cout,,<<,," Copy file from ‘",,<<,,argv,[1],,<<,,"’ to ‘" <<,,argv,[2],,<<,,"’ ",,<<,,endl,;,,,ifstream,fin(,argv,[1]);,,//,,命令行参数,1,作为文件名,,,ofstream fout,(,argv,[2]);,,//,,命令行参数,2,作为文件名,,,char,ch,;,,fin.get(,ch,);,,while(!fin.,eof,()){,,//,,从头读到文件结束,,,fou 59、t,.put(,ch,);,,fin.get(,ch,);,,},,fin.close();,,,fout,.close();,,},*,62,/99,类成员函数,read,与,write,,通常使用,read,与,write,对二进制文件,(binary file),进行读写。,,,,ostream,& write( const char*,pch,,,int nCount,);,,,功能:将,pch,缓冲区中的前,nCount,个字符写出到某个文件中。,,istream,& read( char*,pch,,,int nCount,);,,,功能:从某个文件中读入,nCount,个字符放入 60、,pch,缓冲区中(若读至文件结束尚不足,nCount,个字符时,也将立即结束本次读取过程)。,,,注意:使用,write,与,read,进行数据读写时,不必要在数据间再额外,“,插入,”,分割符,这是因为它们都要求提供第二实参来指定读写长度。,,*,63,/99,,以下的示例程序先使用,write,往自定义二进制磁盘文件中写出如下,3,个,“,值,”,:字符串,str,的长度值,Len(,一个正整数,),、字符串,str,本身、以及一个结构体的数据,而后再使用,read,读出这些,“,值,”,并将它们显示在屏幕上。,,,,#include <,fstream,>,,int,,main( ) 61、,,{,,char,str,[20],,=,,"Hello world!";,,,struct stu,{,,char name[20];,,,int,age;,,double score;,,},ss,,=,,{“,wu jun,”,,,19,,,91.5};,*,64,/99,,cout,,<<,,"WRITE to ',wrt,_read_file.bin'",,<<,,endl,;,,,//,打开用于,“,写,”,的二进制磁盘文件,,,ofstream fout,(",wrt,_read_file.bin",,,ios,::binary);,,,int,Len,,=,,strlen,( 62、,str,);,,,fout,.write( (char*)(&Len),,,sizeof,(,int,) );,,,fout,.write(,str,,,,Len);,//,数据间无需分割符,,,fout,.write((char*)(&,ss,),,,sizeof,(,ss,));,,,fout,.close();,,,cout,,<<,," ------------------------------------------------- ",,<<,,endl,;,,,cout,,<<,,"-- READ it from ',wrt,_read_file.bin' --",,<<,,e 63、ndl,;,,char str2[80];,,,ifstream,fin(",wrt,_read_file.bin",,,ios,::binary);,,fin.read( (char*)(&Len),,,sizeof,(,int,) );,,fin.read(str2,,,Len);,,str2[Len],,=,,'\0';,*,65,/99,,fin.read( (char*)(&,ss,),,,sizeof,(,ss,) );,,,cout,,<<,,"Len=",,<<,,Len,,<<,,endl,;,,,cout,,<<,,"str2=",,<<,,str2,,<<,,endl,; 64、,,,cout,,<<,,",ss,=>",,<<,,ss,.name,,<<,,",",,<<,,ss,.age,,<<,,",",,<<,,ss,.score,,<<,,endl,;,,,fin.close();,,,cout,,<<,," ------------------------------------------------- ",,<<,,endl,;,,},,//,程序执行后的显示结果如下:,,WRITE to ',wrt,_read_file.bin',,-------------------------------------------------,,-- READ 65、it from ',wrt,_read_file.bin' --,,Len=12,,str2=Hello world!,,ss,=>,wu jun,,19,91.5,,-------------------------------------------------,*,66,/99,,最常用格式为:,,,istream,&,getline,( char*,pch,,,int nCount,,,,,char,delim,= '\n' );,,,,功能:从某个文件中读出一行,(,至多,nCount,个字符,),放入,pch,缓冲区中,缺省行结束符为,‘,\n,’,。,,,,程序实例,:,,,,读 66、出,“,getline,.,cpp,”,的各行并显示在屏幕上(如,可将本源程序存放在,“,getline,.,cpp,“,文件中)。,类成员函数,getline,,*,67,/99,,#include,,<,fstream,>,,int,main( ) {,,char line[81];,,,ifstream infile,(,“,getline,.,cpp,”,);,//,,打开文件用于读,,,//,,读出一行,(,至多,80,个字符,),放入,line,中,,,infile,.,getline,(line, 80);,,while(,,!,infile,.,eof,(),,) {,//,,尚未读到文件结束则继续循环,(,处理,),,,cout,,<<,,line,,<<,,endl,;,//,,显示在屏幕上,,,infile,.,getline,(line,,,80);,,//,,再读一行,,,},,,infile,.close();,,},*,68,/99,,text,文件与,binary,文件,,对,text,文件与,binary,文件的一般使用示例,,采用,binary,文件
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。