版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章I/O流类库1主要内容基本概念C++的基本流类结构istream类和ostream类格式控制文件的读/写可流类29.1基本概念设备间的数据传送内存显示屏内存文件键盘内存文件内存键盘文件输出输入39.1基本概念流面向对象技术中,任何设备都可以表示为相应类的对象,设备之间的数据传送即对象之间的数据传送。数据从源对象到目的对象的传送可以抽象看做一个“流”。输入流:表示数据从某个设备传送到内存变量中。输出流:表示数据从内存变量传送到某个设备中。49.1基本概念流类把实现设备之间信息交换的类称作流类。根据一个流类定义的对象也时常被称为流。
C++预定义流标准输入流cin(缺省为键盘)标准输出流cout(显示终端)非缓冲型的标准出错流cerr(显示终端)缓冲型的标准出错流clog(显示终端)59.1基本概念流库若干流类的集合称做流类库。C++流类库是用继承方法建立起来的一个输入/输出类库,它具有两个平行的基类,即streambuf类和ios类,所有其它的流类都是从它们直接或间接地派生出来的。69.2C++的基本流库结构C++为何建立自己的输入输出系统C语言的输入/输出库函数不支持用户自定义的数据类型(如结构、类),用户也不能通过重载这些库函数来实现用户自定义数据类型的输入/输出。structmy_struct{inti;floatf;char*str;}s;printf(“%my_struct”,s);//error79.2C++的基本流库结构C++流库结构C++流库主要由两个流类层次组成以streambuf类为父类的类层次主要完成信息通过缓冲区的交换。以ios类为父类的类层次在streambuf类实现功能的基础上,增加了各种格式化的输入/输出控制方法。89.2C++的基本流库结构C++流库结构streambuf类层次结构streambufstrstreambufstdiobuffilebufstreambuf类层次结构99.2C++的基本流库结构C++流库结构streambuf类层次结构streambuf类为所有的streambuf类层次对象设置了一个固定的内存缓冲区,动态划分为两部分:用做输入的取区,用取指针指示当前取字符位置。用做输出的存区,用存指针指示当前存字符位置。109.2C++的基本流库结构C++流库结构streambuf类层次结构filebuf类它是在fstream.h中定义的streambuf类的一个派生类,它使用文件来保存缓冲区中的字符序列。当写文件时,是将缓冲区的字符写到指定的文件中,之后刷新缓冲区;当读文件时,是将指定文件中的内容读到缓冲区中来。119.2C++的基本流库结构C++流库结构streambuf类层次结构strstreambuf类扩展了streambuf类的功能,增加了动态内存管理功能,提供了在内存中进行提取和插入操作的缓冲区管理。stdiobuf类主要用作C++语言的流类层次方法和C语言的标准输入/输出方法混合使用时系统的缓冲区管理。129.2C++的基本流库结构C++流库结构ios类层次结构iosistreamostreamiostreamistrstreamistream_withassignifstreamostrstreamostream_withassignofstreamstrstreamstdiostreamfstreamios类层次结构139.2C++的基本流库结构C++流库结构ios类层次结构ios类及其派生类是在streambuf类实现的通过缓冲区信息交换的基础上,进一步增加了各种格式化的输入/输出控制方法。ios类的成员变量中包括一个streambuf类类型的指针成员变量,通过该指针,ios类中的成员函数可以调用streambuf类中的公有成员函数。学习中要注意的是,ios类通过指针类型的成员变量,调用streambuf类中公有成员函数的方法,是2.4.1节讨论的对象模式中的消息模式的典型应用例子。149.2C++的基本流库结构C++流库结构ios类层次结构ios设计成虚基类。主要完成流的状态设置、状态报告、显示精度、域宽、填充字符的设置,文件流的操作模式定义等。ios类的定义在include目录下的文件ios.h中:15classios{protected:streambuf*bp;longx_flags;intx_precision;charx_fill;intx_width;public:inlinelongflags()const;inlinelongflags(long_l);inlinelongsetf(long_l);inlinelongunsetf(long_l);16inlineintwidth()const;inlineintwidth(int_i);inlinecharfill()const;inlinecharfill(char_c);inlineintprecision(int_i);inlineintprecision()const;…};17C++流库结构ios类层次结构istream类和ostream类对运算符>>和<<进行重载。iostream类以istream类和ostream类为基类,多重继承派生。可同时进行输入输出操作。9.2C++的基本流库结构189.3istream类和ostream类istream类在流库中提供主要的输入操作,默认对象是cinistream类是在include目录下的文件istream.h中,istream类中定义的运算符和成员函数包括输入运算符>>、get函数、getline函数、read函数等。istream类的定义:19classistream:virtualpublicios{public: istream(streambuf*); istream&operator>>(char*); istream&operator>>(int&); inlineistream&operator>>(unsignedchar*); intget(); istream&get(signedchar*,int,char=‘\n’); istream&get(streambuf&,char=‘\n’); istream&get(unsignedchar&); istream&getline(signedchar*,int,char=‘\n’);
intpeek(); //表示不输入并返回下一个字符
intgcount(); //用来返回上次输入的字符数
istream&read(signedchar*,int); …};209.3istream类和ostream类istream类>>叫做输入运算符,将数据从左边的流中读出。
inti;
cin>>i; //cin.operator>>(i);重载的输入运算符“>>”均返回流类istream的引用,因此输入运算符可连用。例如:intx;chary;cin>>x>>y;219.3istream类和ostream类istream类intget();跳过输入流中1个字符。istream&get(unsignedchar&); 从输入流中提出一个字符。istream&getline(signedchar*,int,char=‘\n’);从输入流中提取指定个数(遇到回车换行符时计数结束)字符到字符数组中。229.3istream类和ostream类istream类例9.1设计一个从键盘输入中提取若干个字符或字符串的例子。#include<iostream.h>voidmain(void){intlength=6;chara,b[6],c[6];cin.get(a);cin.get(); cin.getline(b,length);cin.get();cin.getline(c,length);cout<<a<<“”<<b<<“”<<c<<endl;}239.3istream类和ostream类ostream类ostream类在流库中提供主要的输出操作,默认对象是cout。ostream类是在include目录下的文件ostream.h中,ostream类中定义的运算符和成员函数包括输出运算符<<、put函数、write函数等。ostream类定义:249.3istream类和ostream类classostream:virtualpublicios{public:ostream(streambuf*);ostream&operator<<(constchar*);ostream&operator<<(int);inlineostream&put(char);ostream&write(constchar*,int);//…};259.3istream类和ostream类ostream类<<叫做输出运算符,将运算符右边的数据存储到左边的流中。
cout<<“string”;//cout.operator<<(“string”);269.3istream类和ostream类
ostream类所有重载的输出运算符均返回ostream的引用,利用该引用可继续调用下一个输出运算符函数,因而在一条语句中可以显示多个数据,如:
intx;cout<<“x=“<<x;系统执行如下:输出运算符按自左至右的顺序cout.operator<<(“x=“).operator<<(x)279.3istream类和ostream类
ostream类ostream&put(char);把一个字符插入到输出流中。ostream&write(constchar*,int);从字符数组中提取若干个字符插入到输出流中。289.3istream类和ostream类
ostream类例9.2设计一个包含几种典型情况的屏幕输出的例子。#include<iostream.h>voidmain(void){charch1[]=“i=“,ch2=“x=“;inti=100;floatx=11.11cout<<ch1<<i<<endl;cout<<ch2<<x<<endl;charch3[]=“abcdefg”cout.write(ch3,5);}299.4格式控制C++语言提供了两种格式控制方法利用ios类中的格式控制成员函数利用操作符309.4格式控制格式控制成员函数状态设置和状态报告ios类中定义的long类型的保护数据成员x_flags用于存入控制输入输出格式的状态标志。状态标志位共15个,各占一个二进制位,称为格式状态位。若设置了某个状态标志位,则x_flags中的某一位为“1”,否则为“0”。例如:若在状态标志中设定了skipws和dec,其它均未设定,则x_flags的值应为0000000000010001,即为十六进制的0x0011。这些状态值之间是或的关系,可用“||”连接要设置的状态标志位。319.4格式控制格式控制成员函数状态设置和状态报告设置状态标志longios::setf(longflags){
x_flags=x_flags|flags; returnx_flag;}
功能:把指定位的状态标志设置为1。调用:cout<<setf(ios::hex||ios::scientific);329.4格式控制格式控制成员函数状态设置和状态报告清除状态标志longios::unsetf(longflags){
x_flags=(x_flags)&(~flags); returnx_flags;}功能:把指定位的状态标志设置为0。339.4格式控制格式控制成员函数状态设置和状态报告取状态标志longios::flags()const{ returnx_flags;}功能:返回当前流的状态标志位数值。longios::flags(longflags){ longx=x_flags;
x_flags=flag; returnx;}功能:设置指定位的状态标志,并返回设置前的状态标志位数值。349.4格式控制格式控制成员函数精度设置C语言中采用%m.nf格式,n表示输出精度。C++语言在ios类中用x_precision来存放浮点数的输出显示精度,表示整个数据的位数。int
ios::precision()
{ returnx_precision;}功能:返回当前的显示精度。359.4格式控制格式控制成员函数精度设置int
ios::precision(intn)
{
intx=x_precison;
x_precison=n; returnx;}功能:设置显示精度为n位,并返回设置前的显示精度。369.4格式控制格式控制成员函数域宽设置在ios类中用x_width存放域宽值。int
ios::width(){returnx_width;}功能:返回当前的域宽值。379.4格式控制格式控制成员函数域宽设置int
ios::width(intn){
inti=x_width;
x_width=n; returni;}功能:设置域宽为n位。389.4格式控制格式控制成员函数填充字符设置在ios类中用x_fill来存放填充字符,填充字符的作用是当输出值不满域宽时用填充字符来填充。缺省情况下填充字符为空格。与width()函数配合使用。399.4格式控制格式控制成员函数填充字符设置charios::fill(){returnx_fill;}功能:返回当前的填充字符值charios::fill(charc){charx=x_fill;
x_fill=c;returnx;} 功能:设置填充字符为c。40例子:#include<iostream.h>voidmain(){intcount=432,state=1234;floatx=555.55,y=666.66;cout.fill('#');cout<<"x=";cout.width(8);cout<<x<<endl;cout.setf(ios::dec);cout<<"count="<<count<<endl;cout.setf(ios::hex);cout<<"state="<<state<<endl;cout.precision(4);cout<<"x="<<x<<endl;cout.setf(ios::scientific);cout<<"y="<<y<<endl; }x=##555.55count=432state=4d2x=555.5y=6.6666e+002419.4格式控制操作符使用ios类的成员函数来控制输入/输出格式时,必须缀上使用它的流对象(见例9.2),而且不能将它们直接嵌入到输入/输出语句中。操作符是一个函数,它以一个流引用作为参数,并返回同一流的引用。操作符可以嵌入到输入/输出操作的链中。例如,hex操作符的函数体定义:ios&hex(ios&o){o.setf(ios::hex);returno;}429.4格式控制操作符无参数操作符(表9.1)操作符功能dec选择I/O十进制格式化标志endl插入换行符并刷新输出缓冲流ends插入空字符flush刷新输出缓冲流hex选择I/O十六进制格式化标志oct选择I/O八进制格式化标志ws从输入流中提取空字符439.4格式控制操作符无参数操作符(表9.1)例9.4voidmain(void){intcount=432;intstate=1234;floatx=555.55;cout<<“count=“<<dec<<count<<endl;cout<<“state=“<<hex<<state<<endl;cout.setf(ios::scientific);cout<<“x=“<<x<<endl;}449.4格式控制操作符有参数操作符(表9.2)操作符功能resetionflat(longn)清除n指定的格式化标志setbase(intn)设置以n表示的整型基数setfill(intc)设置以c表示的填充字符setionflags(longn)设置以n表示的格式化标志setprecision(intn)设置以n表示的数值精度setw(intn)设置以n表示的I/O域宽459.4格式控制操作符有参数操作符voidmain(void){constdoublePI=3.141592653589793;cout<<“PI=“<<setprecision(10)<<PI<<endl;intk;cin>>oct>>k;cout<<“k=“<<hex<<k<<endl;floatd=324.567;cout<<“d=“<<setw(10)<<setprecision(5)<<setfill(‘*’)<<dec<<d<<endl;}469.5文件的读/写基本概念C++把文件看作字符序列,即所谓流式文件。根据数据的组织形式,文件可分为文本文件和二进制文件。文本文件又称ASCII文件,它的每个字节存放一个ASCII代码,代表一个字符。这样便于对字符进行处理,也便于输出,但占用存储空间较多479.5文件的读/写基本概念二进制文件是把内存中的数据,按其在内存中的存储形式原样写到磁盘上。用二进制形式输出数据,可节省存储空间和转换时间,但一个字节并不对应一个字符。489.5文件的读/写基本概念文件流是文件与内存等设备之间的信息交换过程。按操作方法,文件可分为输入文件和输出文件。输入文件:文件流从文件到内存(文件流的读)输出文件:文件流从内存到文件(文件流的写)文件流的读打开的文件其它设备(变量)文件流的写499.5文件的读/写基本概念C++中文件输入/输出的基本过程在程序中要包含头文件fstream.h。创建一个流。将这个流与文件相关联,即打开文件。进行文件的读写操作。关闭文件。509.5文件的读/写文件的打开和关闭文件的打开在C++中,打开一个文件,就是将这个文件与一个流建立关联。C++中的文件流类(fstream.h)输入文件流类:ifstream输出文件流类:ofstream输入/输出文件流类:fstream各有4个重载的构造函数。519.5文件的读/写文件的打开和关闭打开文件的两种方式用构造函数方法打开文件——方法1ifstream(constchar*,int=ios::in,int=filebuf::openprot);ofstream(constchar*,int=ios::out,int=filebuf::openprot);fstream(constchar*,int,int=filebuf::openprot);参数含义:字符串形式的文件名、文件流的操作模式、打开文件的共享/保护模式。529.5文件的读/写文件的打开和关闭打开文件的两种方式定义文件流类的对象,建立外存介质上的文件和内存的交换通道,并指定数据交换的方向。例如:ifstreamifs(“Data1.dat”);ofstreamofs(“Data2.dat”);fstreamiofs(“Data3.data”,ios::in|ios::out);539.5文件的读/写文件的打开和关闭打开文件的两种方式用打开成员函数打开文件——方法2voidifstream::open(constchar*,int=ios::in,
int=filebuf::openprot);voidofstream::open(constchar*,int=ios::out,
int=filebuf::openprot);voidfstream::open(constchar*,int,
int=filebuf::openprot);549.5文件的读/写例如:ifstreamifs;ofstreamofs;fstreamiofs;ifs.open(“Data1.dat”);ofs.open(“Data2.dat”);iofs.open(“Data3.dat”,ios::in|ios::out);打开当前工作目录下的指定的文件;如果当前工作目录下不存在指定文件,则在当前工作目录下创建一个新的指定文件。可指定文件目录,如:ifstreamifs(“e:\mytest\Data1.dat”);559.5文件的读/写文件的打开和关闭文件的关闭关闭文件即是使打开的文件与流“脱钩”。使用流类的成员函数close()完成,它不带参数,无返回值。例如:ifs.close();将关闭与流ifs相连接的文件。569.5文件的读/写文件的打开和关闭关闭文件的作用把要写入文件的数据从缓冲区中完全写回磁盘。(内存和文件的数据交换是通过缓冲区完成的。)保证文件安全。579.5文件的读/写文件的打开和关闭文件的操作模式ios类中定义的文件操作模式共8种,每种占一个二进制。Emum
open_mod{in=0x01,out=0x02,….};允许同时有一个以上的操作模式位为1。文件打开的默认方式为文本方式。589.5文件的读/写文本文件的读/写基本概念文件打开的默认方式是文本格式(text)。本文件支持文件的顺序访问,即从文件的起始到文件的结束顺序地访问(即存取)文件中的数据。599.5文件的读/写文本文件的读/写文本文件的读文件打开的缺省方式是以文本格式打开,在输入时回车和换行两个字符要转换为字符‘\n’;在输出时,字符‘\n’转换为回车和换行两个字符。文件流的读对应内存变量的输入,即产生一个输入流。ifstream类的对象可以使用ios类中定义的输入运算符“>>”以及get()、getline()成员函数向内存变量“输入”信息。609.5文件的读/写文本文件的读/写文本文件的读例9.6把当前工作目录下的Data1.dat文件中的字符数据显示在屏幕上。用get()成员函数输入#include<fstream.h>#include<stdlib.h>voidmain(){ifstreamifs(“data1.txt");if(!ifs){cerr<<"错误:无法打开文件"<<endl;return;}
619.5文件的读/写
charc;intn=0;while(ifs.get(c)){cout.put(c);n++;}cout<<endl<<"字符个数:"<<n<<endl;ifs.close();}注意:‘\n’转换与回车和换行字符之间的转换。629.5文件的读/写用getline()成员函数输入charbuffer[20];intn=0;while(!ifs.eof()){ifs.getline(buffer,sizeof(buffer));cout<<buffer<<endl;n++;}cout<<endl<<"行数:"<<n<<endl;639.5文件的读/写用输入操作符“>>”把文件流中的数据输入到内存变量说明:输入操作符“>>”将略去回车换行符。charc;intn=12;while(n){ifs>>c;cout<<c<<endl;n--;}文件内容:HowareyouThankyou程序运行结果:HowareyouTha649.5文件的读/写文本文件的读/写文本文件的写文件流的写对应内存变量的输出,即产生一个输出流。
ofstream类的对象可以使用ostream类中定义的输出操作符“<<”,以及put()、wirte()成员函数“输出”信息。例9.7把内存变量中的字符数据输出到当前目录下的文件Data2.dat中。659.5文件的读/写用put()成员函数输出voidmain(){ofstreamofs("data2.txt");if(!ofs){cerr<<"错误:无法打开文件"<<endl;return;}
charstr[]="Howareyou\nThankyou";intlen=strlen(str);for(inti=0;i<len;i++)ofs.put(str[i]);}669.5文件的读/写用write()成员函数输出用输出操作符“<<”输出charstr1[]="Howareyou\n";charstr2[]="Thankyou\n";ofs.write(str1,strlen(str1));ofs.write(str2,strlen(str2));charstr1[]="Howareyou\n";charstr2[]="Thankyou\n";ofs<<str1;ofs<<str2;679.5文件的读/写二进制文件的读/写基本概念二进制文件不仅支持顺序访问,还支持随机访问。文本文件的读/写要进行字符‘\n’与回车和换行符之间的转换,而在二进制方式下,不进行这样的转换。在创建二进制文件流类的文件对象时,用逻辑或的方法加上操作模式ios::binary,即表示采用二进制格式进行文件流的读/写。689.5文件的读/写二进制文件的读/写//读文件ifstreamifs("data3.dat",ios::binary);//…ifs>>d;ifs>>c;ifs>>r;cout<<"d="<<d<<endl;cout<<"r="<<r<<endl;ifs.close();699.5文件的读/写二进制文件的读/写//写文件ofstreamofs("data3.dat",ios::binary);//…判断打开成功与否intd=44,r=99;charc=',';ofs<<d;ofs<<c;ofs<<r;ofs.close();709.5文件的读/写二进制文件的读/写二进制文件支持随机访问,使用read()和write()成员函数读/写文件。istream&istream::read(char*,int);ostream&ostream:write(constchar*,int);例9.8719.5文件的读/写随机访问文件文件指针指示文件流的当前位置。读指针写指针729.5文件的读/写
随机访问文件文件指针的定位操作读指针的成员函数:istream&seekg(<偏移量>,<参照位置>);操作写指针的成员函数:ostream&seekp(<偏移量>,<参照位置>);偏移量:文件指针相对于参照位置偏移的字节量。参照位置:ios::beg
ios
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论