版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第1010章章 输入输出流输入输出流10.1 10.1 文件、流以及文件、流以及C+C+的流类库的流类库* *10.2 10.2 插入与提取运算符的重载插入与提取运算符的重载10.3 10.3 I/OI/O格式的控制格式的控制10.4 10.4 磁盘文件的输入输出磁盘文件的输入输出10.10.5 text5 text文件与文件与binarybinary文件文件* *10.10.6 6 字符串流字符串流10.7 10.7 其他输入输出控制函数其他输入输出控制函数210.1 10.1 文件、流以及文件、流以及C+C+的流类库的流类库- - 参看书参看书p325p3251 1 流类库的优点流类库
2、的优点 用用C+C+语言自己的支持语言自己的支持I/O I/O 操作的流类库代替操作的流类库代替printf printf 函数族,是一个明显的进步函数族,是一个明显的进步 (1 1)简明与可读性)简明与可读性 I/O I/O 语句更为简明,增加了可读性语句更为简明,增加了可读性(2 2)类型安全()类型安全(type safetype safe)所谓类型安全,是指在进行所谓类型安全,是指在进行I/O I/O 操作时不应对于参加操作时不应对于参加输入输出的数据在类型上发生不应有的变化输入输出的数据在类型上发生不应有的变化 (3 3)易于扩充)易于扩充32 2 文件与流的概念文件与流的概念 C+
3、 C+语言中的输入输出操作语言中的输入输出操作( (功能功能) )是由它所预是由它所预定义的诸定义的诸I/OI/O流类的一个类库所提供的。流类的一个类库所提供的。 1. 1. 流流( (Stream)Stream) 流流( (stream)stream)是一个逻辑概念是一个逻辑概念,它是,它是C+C+语言对语言对所有外部设备的逻辑抽象,它所有外部设备的逻辑抽象,它代表的是某种流类类代表的是某种流类类型的一个对象型的一个对象。C+C+的的IOIO系统将每个外部设备都转系统将每个外部设备都转换成一个称为流的逻辑设备,由流来完成对不同设换成一个称为流的逻辑设备,由流来完成对不同设备的具体操作。备的具
4、体操作。4 2. 2. 文件文件( (File)File) 文件文件( (File)File)是一个物理概念是一个物理概念,代表存储着信息集合的某,代表存储着信息集合的某个个外部介质外部介质,它是,它是C+C+语言语言对具体设备的抽象对具体设备的抽象。如,磁盘文。如,磁盘文件,显示器,键盘(又可以分为文本和二进制文件)。件,显示器,键盘(又可以分为文本和二进制文件)。 所有流所有流( (类对象类对象) )的行为都是相同的,而不同的文件则可的行为都是相同的,而不同的文件则可能具有不同的行为。如,磁盘文件可进行写也可进行读操作;能具有不同的行为。如,磁盘文件可进行写也可进行读操作;显示器文件则只可
5、进行写操作;而键盘文件只可进行读操作。显示器文件则只可进行写操作;而键盘文件只可进行读操作。 当程序与一个文件交换信息时,必须通过当程序与一个文件交换信息时,必须通过“打开文件打开文件”的操作将一个文件与一个流的操作将一个文件与一个流( (类对象类对象) )联系起来。一旦建立了联系起来。一旦建立了这种联系,以后对该流这种联系,以后对该流( (类对象类对象) )的访问就是对该文件的访问,的访问就是对该文件的访问,也就是对一个具体设备的访问。可通过也就是对一个具体设备的访问。可通过“关闭文件关闭文件”的操作的操作将一个文件与流将一个文件与流( (类对象类对象) )的联系断开。的联系断开。5 3.
6、3. C+C+的基本流类库的基本流类库 在头文件在头文件 “iostream.hiostream.h” 中说明中说明( (预定义预定义) )了一批了一批基本基本流类流类: : iosios - - 基本流类的基类基本流类的基类; ; istreamistream - - 由由iosios派生,支持输入派生,支持输入( (提取提取“”) )操操作;作; ostreamostream - - 由由iosios派生,支持输出派生,支持输出( (插入插入“”) )操操作;作; iostreamiostream - - 由由istreamistream与与ostreamostream共同派生,支持输共同
7、派生,支持输入和输出双向操作。入和输出双向操作。 6 C+ C+预定义的流预定义的流有:有: extern istream extern istream cincin; - ; - 对象对象cincin对应于对应于键盘键盘文件文件 extern ostream extern ostream coutcout; - ; - 对象对象coutcout对应于对应于显示器显示器文件文件 extern ostream extern ostream cerrcerr; - ; - 对象对象cerrcerr对应于对应于显示器显示器文件文件 extern ostream extern ostream clog
8、clog; - ; - 对象对象clogclog对应于对应于显示器显示器文件文件 程序中可直接对上述程序中可直接对上述4 4个预定义流类对象进行读写,而不个预定义流类对象进行读写,而不必先进行必先进行“打开文件打开文件”的操作,使用完后也不需要进行的操作,使用完后也不需要进行“关关闭文件闭文件”的操作(因为这些流类对象与文件之间的联系是预的操作(因为这些流类对象与文件之间的联系是预定义好的,可认为系统已为每一程序都隐含进行了对它们的定义好的,可认为系统已为每一程序都隐含进行了对它们的打开与关闭操作)。打开与关闭操作)。 7 4. C+ 4. C+的文件流类库的文件流类库 在头文件在头文件“fs
9、tream.hfstream.h”中说明中说明( (预定义预定义) )了一批了一批文件流文件流类类,专用于,专用于磁盘文件磁盘文件: : ifstreamifstream - - 由由istreamistream派生,支持从磁盘文件中输入派生,支持从磁盘文件中输入( (读入读入) )数据;数据; ofstreamofstream - - 由由ostreamostream派生,支持往磁盘文件中输出派生,支持往磁盘文件中输出( (写出写出) )数据;数据; fstreamfstream - - 由由iostreamiostream派生,支持对磁盘文件进行派生,支持对磁盘文件进行输入和输出数据的双向
10、操作。输入和输出数据的双向操作。 C+C+中没有预定义的文件流中没有预定义的文件流( (类对象类对象) ),程序中用到的所,程序中用到的所有文件流类对象都要进行自定义。有文件流类对象都要进行自定义。8* *10.2 10.2 插入与提取运算符的重载插入与提取运算符的重载 - - 参看书参看书p329p329对自定义类对自定义类complexcomplex重载输入输出运算符重载输入输出运算符“”:#includeclasscomplexdoubler;doublei;public:complex(doubler0=0,doublei0=0)r=r0;i=i0;complexoperator+(c
11、omplexc2);complexoperator*(complexc2);friendistream&operator(istream&in,complex&com);friendostream&operatoroperator”用于完成从用于完成从istreamistream类的流类对象类的流类对象inin上(如对上(如对应实参可为应实参可为cincin,即指定从键盘上)输入一个复数的有关数据放入即指定从键盘上)输入一个复数的有关数据放入complexcomplex型引用对象型引用对象comcom中;而中;而“operatoroperator”则用于实现往则
12、用于实现往ostreamostream类的流类对象类的流类对象outout上(如对应实参可为上(如对应实参可为coutcout,即指定往屏幕上)输出即指定往屏幕上)输出complexcomplex类对象类对象comcom的的有关数据。有关数据。 3.3. 本程序重载的输入输出运算符的返回类型均为引用,为的是可使用本程序重载的输入输出运算符的返回类型均为引用,为的是可使用返回结果继续作左值,也即使返回结果能起到一个独立对象(变量)的作返回结果继续作左值,也即使返回结果能起到一个独立对象(变量)的作用,从而可使用像用,从而可使用像“coutc1c2;coutc1c1c2;cinc1c2;”这样的调
13、用语句。这样的调用语句。另外,另外,“operator operator ”的第二形参的第二形参comcom也必须被说明成引用也必须被说明成引用“complex& complex& comcom”,目的则是要将输入数据直接赋值给对应实参变量(所拥有的存储空目的则是要将输入数据直接赋值给对应实参变量(所拥有的存储空间中)。间中)。10 complexcomplex:operator+(complexc2)complexc;c.r=r+c2.r;c.i=i+c2.i;returnc;complexcomplex:operator*(complexc2)complextemp;tem
14、p.r=(r*c2.r)-(i*c2.i);temp.i=(r*c2.i)+(i*c2.r);returntemp;11istream&operator(istream&in,complex&com)incom.rcom.i;returnin; /不可缺少,因为函数返回类型为不可缺少,因为函数返回类型为“istream&”ostream&operator(ostream&out,complexcom)out(com.r,com.i)endl;returnout;/不可缺少,因为函数返回类型为不可缺少,因为函数返回类型为“ostream&”
15、voidmain()complexc1(1,1),c2(2,3),c3,res;coutc1=c1c2=c2;res=c1+c2;coutc1+c2=res;coutc1*c2=c1*c2;12 coutc3;coutc3+c3=c3+c3;/*注意输入输出语句中出现的注意输入输出语句中出现的类对象类对象cout以及以及cin正是正是输输入输出重载函数中入输出重载函数中引用型形参引用型形参out以及以及in的对应实参的对应实参。即是说,。即是说,若使用若使用“coutc1;”它将等同于它将等同于“operatorc3;”则等同于使用则等同于使用“operator(cin,c3);”。*/程序执
16、行后,屏幕显示结果为:程序执行后,屏幕显示结果为:c1=(1,1)c2=(2,3)c1+c2=(3,4)c1*c2=(-1,5)Inputc3:3-5c3+c3=(6,-10)1310.3 10.3 I/OI/O的格式控制的格式控制1 1 格式控制函数及格式控制符格式控制函数及格式控制符 2 2 I/OI/O格式控制示例格式控制示例 141 1 格式控制函数及格式控制符格式控制函数及格式控制符 1. 1. iosios类中常用的公有格式控制成员函数类中常用的公有格式控制成员函数 在在iosios类中定义了一批公有的类中定义了一批公有的格式控制标志位格式控制标志位以及一些以及一些成员函数,通常先
17、用某些成员函数来设置标志位,然后再使成员函数,通常先用某些成员函数来设置标志位,然后再使用另一些成员函数来进行格式输出。另外,用另一些成员函数来进行格式输出。另外,iosios类中还设置了类中还设置了一个一个longlong型的数据成员用来记录当前被设置的格式状态,该型的数据成员用来记录当前被设置的格式状态,该数据成员被称为数据成员被称为格式控制标志字格式控制标志字( (或标志状态字或标志状态字) )。标志字是。标志字是由格式控制标志位来由格式控制标志位来“合成合成”的。的。 注意,注意,iosios类作为诸多类作为诸多I/OI/O流类的基类,其公有成员函数流类的基类,其公有成员函数当然可被各
18、派生类的对象所直接调用。当然可被各派生类的对象所直接调用。15 (1) (1) ios:flagsios:flags a.a. 格式一格式一: : long flags( long lFlags ); long flags( long lFlags ); 通过参数通过参数lFlagslFlags来重新设置来重新设置标志字标志字。 表示各表示各标志位标志位的枚举常量有的枚举常量有( (参看参看p235)p235):ios:skipwsios:skipwsios:left ios:left ios:right ios:right .ios:stdioios:stdio 每一枚举常量值都代表着格式控
19、制标志字中的某一个二每一枚举常量值都代表着格式控制标志字中的某一个二进制位进制位( (bit)bit),当设置了某个标志位属性时,该位将取值当设置了某个标志位属性时,该位将取值“1 1”,否则该位取值,否则该位取值“0 0”。 16 另外注意,通过另外注意,通过使用位运算符使用位运算符“| |”可将多个格式控制可将多个格式控制标志位属性进行标志位属性进行“合成合成”。但从使用角度看,。但从使用角度看,所设置的标所设置的标志位属性不能产生互斥志位属性不能产生互斥。例如,格式控制标志字中设立了。例如,格式控制标志字中设立了三个平行的标志位三个平行的标志位( (ios:decios:dec、ios:
20、octios:oct和和ios:hex)ios:hex)用于用于表示数制,程序员应保障任何时刻只设置其中的某一个标表示数制,程序员应保障任何时刻只设置其中的某一个标志位。还有表示对齐标志位的志位。还有表示对齐标志位的ios:leftios:left、ios:rightios:right和和i o s : : i n t e r n a li o s : : i n t e r n a l , 以 及 表 示 实 数 格 式 标 志 位 的以 及 表 示 实 数 格 式 标 志 位 的ios:scientificios:scientific和和ios:fixedios:fixed,这些互斥属性也
21、不能同时这些互斥属性也不能同时设置。设置。 b.b. 格式二格式二: : long flags(); long flags(); 返回当前的标志字。返回当前的标志字。 17 (2) ios:setf(2) ios:setf a.a. 格式一格式一: : long setf( long lFlags ); long setf( long lFlags ); 通过参数通过参数lFlagslFlags来设置指定的格式控制标志位。来设置指定的格式控制标志位。 注意,与注意,与flagsflags函数的函数的“替换替换”方式不同,此处为方式不同,此处为“添加添加”方式,即是说,它并不更改其它方式,即是说
22、,它并不更改其它lFlagslFlags不涉及到的那些标不涉及到的那些标志位的当前值。志位的当前值。 b.b. 格式二格式二: : long setf( long lFlags, long lMask );long setf( long lFlags, long lMask ); 设置指定的格式控制标志位的值(首先将第二参数设置指定的格式控制标志位的值(首先将第二参数lMasklMask所指定的那些位清零,而后用第一参数所指定的那些位清零,而后用第一参数lFlagslFlags所给定的值来所给定的值来重置这些标志位)。重置这些标志位)。 18 例如,为保障所设置的数制标志位不产生互斥,当要设例
23、如,为保障所设置的数制标志位不产生互斥,当要设置置16进制时使用:进制时使用:setf(ios:hex,ios:basefield);其中的其中的ios:basefield为一个在为一个在ios类中定义的公有静态常类中定义的公有静态常量,它的取值为量,它的取值为ios:dec|ios:oct|ios:hex。同理,当要设置对齐标志位为同理,当要设置对齐标志位为ios:right以及实数格式标以及实数格式标志位为志位为ios:fixed,要使用:要使用:setf(ios:right,ios:adjustfield);setf(ios:fixed,ios:floatfield);其中用到了公有静态
24、常量其中用到了公有静态常量ios:adjustfield和和ios:floatfield。ios:adjustfield的取值为的取值为ios:left|ios:right|ios:internal,而而ios:floatfield的取值为的取值为ios:scientific|ios:fixed。19(3) ios:unsetf(3) ios:unsetf long unsetf( long lFlags );long unsetf( long lFlags ); 通过参数通过参数lFlagslFlags来清除指定的格式控制标志位。来清除指定的格式控制标志位。 (4) (4) ios:fill
25、ios:fill char fill( char cFill ); char fill( char cFill ); 将将“填充字符填充字符”设置为设置为cFill, cFill, 并返回原并返回原“填充字填充字符符”。20(5) ios:precision(5) ios:precision int precision( int np );int precision( int np ); 设置浮点数精度为设置浮点数精度为npnp并返回原精度。当格式为并返回原精度。当格式为ios:scientificios:scientific或或ios:fixedios:fixed时,精度时,精度npnp指小
26、数点后的位指小数点后的位数,否则指有效数字。数,否则指有效数字。(6) (6) ios:widthios:width int width( int nw );int width( int nw ); 设置当前被显示数据的域宽设置当前被显示数据的域宽nwnw并返回原域宽。默认值并返回原域宽。默认值为为0 0,将按实际需要的域宽进行输出。此设置只对随后的一,将按实际需要的域宽进行输出。此设置只对随后的一个数据有效,而后系统立刻恢复域宽为系统默认值个数据有效,而后系统立刻恢复域宽为系统默认值0 0。21 2. 2. 常用的输入输出格式控制符常用的输入输出格式控制符 可直接用于提取和插入算符可直接用于
27、提取和插入算符( (“”和和“”) )之后,而之后,而不像格式控制成员函数那样必须被单独调用。不像格式控制成员函数那样必须被单独调用。 (1) (1) iostream.hiostream.h中含有的无参格式控制符中含有的无参格式控制符( (参看参看p337)p337):. endl. endl. ends. ends. flush. flush. ws. ws. dec. dec. hex. hex. oct. oct22 (2) iomanip.h(2) iomanip.h中含有的有参格式控制符中含有的有参格式控制符 . setbase( int base ) . setbase( int
28、 base ). resetiosflags( long lFlags ). resetiosflags( long lFlags ). setiosflags( long lFlags ). setiosflags( long lFlags ). setfill( char cFill ). setfill( char cFill ). setprecision( int np ). setprecision( int np ). setw( int nw ). setw( int nw )232 2 I/OI/O格式控制示例格式控制示例 1.格式控制示例一格式控制示例一(flags和和se
29、tf等函数的功能等函数的功能)#includevoidmain()coutiosbasefield;/输出:输出:112cout(ios:dec|ios:oct|ios:hex)endl;/输出:输出:112coutios:adjustfield;/输出:输出:14cout(ios:left|ios:right|ios:internal)endl;/输出:输出:14coutios:floatfield;/输出:输出:6144cout(ios:scientific|ios:fixed)endl;/输出:输出:614424/flags将重新设置标志字,将重新设置标志字,“替换替换”方式方式cout
30、.flags(ios:showbase);coutcout.flags()endl;/输出:输出:128cout.flags(ios:showpoint);coutcout.flags()endl;/输出:输出:256cout.unsetf(ios:showpoint);coutcout.flags()endl;/输出:输出:0/setf为为“添加添加”方式方式cout.setf(ios:showbase);coutcout.flags()endl;/输出:输出:128cout.setf(ios:showpoint);coutcout.flags()endl;/输出:输出:384cout.un
31、setf(ios:showpoint);coutcout.flags()endl;/输出:输出:128252.格式控制示例二格式控制示例二对输出数据的宽度、精度等方面进行设置与使用。对输出数据的宽度、精度等方面进行设置与使用。#includevoidmain()cout.width(6);/只管随后一个数的域宽只管随后一个数的域宽cout478527.4272endl;/478527.4272coutsetw(6)4785setw(8)27.4272endlendl;/478527.4272cout.width(6);cout.precision(3);/当格式为当格式为ios:scienti
32、fic或或ios:fixed时,浮点数精度时,浮点数精度/np指小数点后的位数,否则指有效数字指小数点后的位数,否则指有效数字/此时设置浮点数的有效数字为此时设置浮点数的有效数字为3cout4785setw(8)27.4272endl;/478527.426coutsetw(6)4785setw(8)setprecision(2)27.4272endlendl;/478527/“setprecision(2)”设置浮点数的有效数字设置浮点数的有效数字cout.setf(ios:fixed,ios:floatfield);/今后以定点格式显示浮点数今后以定点格式显示浮点数(无指数部分无指数部分)
33、cout.width(6);cout.precision(3);/当格式为当格式为ios:fixed时,设置小数点后的位数时,设置小数点后的位数cout4785setw(8)27.4272 = 读写操作读写操作 = = 关闭文件关闭文件。 28 “打开文件打开文件”通常通过构造函数自动完成(也可显式调用通常通过构造函数自动完成(也可显式调用成员函数成员函数openopen完成)。完成)。“关闭文件关闭文件”通常通过使用通常通过使用“ .close();close();”来显式完成。来显式完成。 例例1: 1: ofstream outfile1(myfile1.txt);ofstream ou
34、tfile1(myfile1.txt); 创建创建ofstreamofstream类的对象类的对象outfile1outfile1;使流类对象使流类对象outfile1outfile1与与磁盘文件磁盘文件 myfile1.txtmyfile1.txt相联系;并打开用于相联系;并打开用于“写写”的磁盘的磁盘文件文件 myfile1.txtmyfile1.txt。 例例2: 2: ofstream outfile1;ofstream outfile1; / /创建创建ofstreamofstream类的对象类的对象outfile1outfile1 outfile1.open(myfile1.txt
35、); outfile1.open(myfile1.txt); / /显式调用成员函数显式调用成员函数openopen来打开文件来打开文件29 二二.与创建流类对象相关的三个构造函数与创建流类对象相关的三个构造函数1.ifstream:ifstreamifstream(constchar*szName,intnMode=ios:in,intnProt=filebuf:openprot);参数参数:(1)szName-文件名;文件名;(2)nMode-打开文件的方式。打开文件的方式。ios:in-以读以读(输入输入)为目的打开。为目的打开。ios:nocreate-仅打开一个已存在文件。仅打开一个
36、已存在文件。ios:binary-打开二进制文件。打开二进制文件。(3)nProt-指定所打开文件的保护方式。指定所打开文件的保护方式。302.ofstream:ofstreamofstream(constchar*szName,intnMode=ios:out,intnProt=filebuf:openprot);参数参数:(1)szName-文件名;文件名;(2)nMode-打开文件的方式。打开文件的方式。ios:out-以写以写(输出输出)为目的打开文件。为目的打开文件。ios:trunc-若文件存在,则将文件长度截为若文件存在,则将文件长度截为0。ios:binary-打开二进制文件。
37、打开二进制文件。ios:app-以追加方式打开。以追加方式打开。.(3)nProt-指定所打开文件的保护方式。指定所打开文件的保护方式。31 3.fstream:fstreamfstream(constchar*szName,intnMode,intnProt=filebuf:openprot);参数含义和用法与参数含义和用法与ofstream构造函数处相同。构造函数处相同。三三.与创建流类对象相关的三个与创建流类对象相关的三个open函数函数1.ofstream:openvoidopen(constchar*szName,intnMode=ios:out,intnProt=filebuf:o
38、penprot);2.ifstream:openvoidopen(constchar*szName,intnMode=ios:in,intnProt=filebuf:openprot);3.fstream:openvoidopen(constchar*szName,intnMode,intnProt=filebuf:openprot);3210.4.2使用插入与提取与算符进行使用插入与提取与算符进行I/O操作操作- - 参看书参看书p343p343 对文件的对文件的“读写操作读写操作”通常使用预定义的通常使用预定义的类成员函数类成员函数来实现(课本来实现(课本10.4.310.4.3节介绍),
39、但也可使用继承而来的节介绍),但也可使用继承而来的插入插入和提取运算符和提取运算符“”和和“operator ”,所以,所以,ifstreamifstream流(类对象)可以使用预定义的算符流(类对象)可以使用预定义的算符“”来对自定义磁盘来对自定义磁盘文件进行文件进行“读读”操作(允许通过派生类对象直接调用其基类操作(允许通过派生类对象直接调用其基类的公有成员函数);的公有成员函数); ofstreamofstream类由类由ostreamostream类所派生类所派生,而,而ostreamostream类中预定义类中预定义了公有的运算符了公有的运算符重载函数重载函数“operator op
40、erator ”,所以,所以,ofstreamofstream流(类对象)可以使用预定义的算符流(类对象)可以使用预定义的算符“”和和“”来对自定义磁盘文件进行来对自定义磁盘文件进行“读读” 与与“写写”操作。操作。 还有一点需要注意:使用预定义的算符还有一点需要注意:使用预定义的算符“”来进行来进行“读读”操作操作时遇空格或换行均结束一个数据相呼应。时遇空格或换行均结束一个数据相呼应。 下述下述示例程序示例程序做了如下的做了如下的3 3件事:件事:1)1) 往文件写数据;往文件写数据;2)2) 往文件尾部追加数据;往文件尾部追加数据; 3)3) 从文件读出数据并显示在屏幕上。从文件读出数据并
41、显示在屏幕上。 34#includevoidmain()/1)往文件写数据往文件写数据ofstreamoutfile1(myfile1.txt);/以以“写写”方式打开方式打开outfile1Hello!.CHINA!Nankai_Universityendl;outfile1.close();/2)往文件尾部追加数据往文件尾部追加数据outfile1.open(myfile1.txt,ios:app);/以以“追加追加”方式打开方式打开intx=1212,y=6868;outfile1xystr1str2;/使用使用“”读读(遇空格、换行均结束遇空格、换行均结束)infile1x2y2;in
42、file1.close();35coutstr1=str1endl;coutstr2=str2endl;coutx2=x2endl;couty2=y2endl;程序执行后的显示结果如下:程序执行后的显示结果如下:str1=Hello!.CHINA!str2=Nankai_Universityx2=1212y2=686836 4.3 使用类成员函数对文件流进行操作使用类成员函数对文件流进行操作1 1 类成员函数类成员函数getget与与putput2 2 类成员函数类成员函数readread与与writewrite3 3 类成员函数类成员函数getlinegetline 371
43、 1 类成员函数类成员函数getget与与putput- - 参看书参看书p345p345 ostream& put( char ch );ostream& put( char ch );功能:将字符功能:将字符chch写到自定义文件中。写到自定义文件中。 istream& get( char& rch );istream& get( char& rch );功能:从自定义文件中读出功能:从自定义文件中读出1 1个字符放入引用个字符放入引用rchrch中。中。 注意,注意,putput实际上只是实际上只是ostreamostream类中定义的公有
44、成员类中定义的公有成员函数,当然通过其派生类函数,当然通过其派生类ofstreamofstream的类对象也可以直接的类对象也可以直接对它进行调用。同理,通过对它进行调用。同理,通过ifstreamifstream的类对象可以直接的类对象可以直接调用调用getget。381.程序示例一程序示例一从键盘输入任一个字符串,通过从键盘输入任一个字符串,通过put将其写到自定义磁盘文件将其写到自定义磁盘文件“putgetfile.txt”中,而后再使用中,而后再使用get从该文件中读出所写串并显示在屏幕上。从该文件中读出所写串并显示在屏幕上。#include#includevoidmain()/键盘输
45、入字符串,通过键盘输入字符串,通过put将其写到自定义磁盘文件中将其写到自定义磁盘文件中charstr80;coutInputstring:endl;gets(str);ofstreamfout(putgetfile.txt);inti=0;while(stri)fout.put(stri+);fout.close();cout-endl;39/而后使用而后使用get从文件中读出该串显示在屏幕上从文件中读出该串显示在屏幕上charch;ifstreamfin(putgetfile.txt);fin.get(ch);while(!fin.eof()/从头读到文件结束从头读到文件结束(当前符号非文
46、件结束符时继续当前符号非文件结束符时继续)/注注:成员函数成员函数eof()在读到文件结束时方返回在读到文件结束时方返回truecoutch;fin.get(ch);coutendl;fin.close();程序执行后的显示结果如下:程序执行后的显示结果如下:Inputstring:Fileoperating-usingputandget,OK!12345-Fileoperating-usingputandget,OK!12345402.程序示例二程序示例二-对指定文件进行拷贝对指定文件进行拷贝使用类成员函数使用类成员函数get与与put对指定文件进行拷贝。被拷贝对指定文件进行拷贝。被拷贝的的
47、“源文件源文件”以及拷贝到的以及拷贝到的“目的文件目的文件”的名字与路径均由的名字与路径均由命令行参数来提供。命令行参数来提供。程序执行结果程序执行结果(若提供的命令行参数为若提供的命令行参数为:mycopy.cppres_1.cpp):Copyfilefrommycopy.cpptores_1.cpp程序执行结果程序执行结果(若提供的命令行参数个数不对时若提供的命令行参数个数不对时):ERROR!-supplying2command-lineargements?!41#include#includevoidmain(intargc,char*argv)if(argc!=3)/命令行参数个数不
48、对时命令行参数个数不对时coutERROR!-supplying2command-lineargements?!endl;exit(1);coutCopyfilefromargv1toargv2endl;ifstreamfin(argv1);/命令行参数命令行参数1作为文件名作为文件名ofstreamfout(argv2);/命令行参数命令行参数2作为文件名作为文件名charch;fin.get(ch);while(!fin.eof()/从头读到文件结束从头读到文件结束fout.put(ch);fin.get(ch);fin.close();fout.close();42 2 2 类成员函数类
49、成员函数readread与与write write - - 参看书参看书p347p347 通常使用通常使用read与与write对二进制文件对二进制文件(binaryfile)进行读写。进行读写。ostream&write(constchar*pch,intnCount);功能:将功能:将pch缓冲区中的前缓冲区中的前nCount个字符写出到某个文件中。个字符写出到某个文件中。istream&read(char*pch,intnCount);功能:从某个文件中读入功能:从某个文件中读入nCount个字符放入个字符放入pch缓冲区中缓冲区中(若读至文件结束尚不足(若读至文件结束尚
50、不足nCount个字符时,也将立即结束个字符时,也将立即结束本次读取过程)。本次读取过程)。注意:使用注意:使用write与与read进行数据读写时,不必要在数据进行数据读写时,不必要在数据间再额外间再额外“插入插入”分割符,这是因为它们都要求提供第二分割符,这是因为它们都要求提供第二实参来指定读写长度。实参来指定读写长度。43 以下的示例程序先使用以下的示例程序先使用write往自定义二进制磁盘文件往自定义二进制磁盘文件中写出如下中写出如下3个个“值值”:字符串:字符串str的长度值的长度值Len(一个正整一个正整数数)、字符串、字符串str本身、以及一个结构体的数据,而后再使用本身、以及一
51、个结构体的数据,而后再使用read读出这些读出这些“值值”并将它们显示在屏幕上并将它们显示在屏幕上。#include#includevoidmain()charstr20=Helloworld!;structstucharname20;intage;doublescore;ss=wujun,22,91.5;44 coutWRITEtowrt_read_file.binendl;ofstreamfout(wrt_read_file.bin,ios:binary);/打开用于打开用于“写写”的二进制磁盘文件的二进制磁盘文件intLen=strlen(str);fout.write(char*)(&
52、amp;Len),sizeof(int);fout.write(str,Len);/数据间无需分割符数据间无需分割符fout.write(char*)(&ss),sizeof(ss);fout.close();cout-endl;cout-READitfromwrt_read_file.bin-endl;charstr280;ifstreamfin(wrt_read_file.bin,ios:binary);fin.read(char*)(&Len),sizeof(int);fin.read(str2,Len);str2Len=0;45 fin.read(char*)(&
53、;ss),sizeof(ss);coutLen=Lenendl;coutstr2=str2endl;,ss.age,ss.scoreendl;fin.close();cout-wujun,22,91.5-46 最常用格式为:最常用格式为:istream&getline(char*pch,intnCount,chardelim=n);功能:从某个文件中读出一行功能:从某个文件中读出一行(至多至多nCount个字符个字符)放入放入pch缓冲区中,缺省行结束符为缓冲区中,缺省行结束符为n。程序实例程序实例:读出读出“getline_1.cpp”的各行并显示在屏幕上(如,
54、可的各行并显示在屏幕上(如,可将本源程序存放在将本源程序存放在“getline_1.cpp“文件中)。文件中)。3 3 类成员函数类成员函数getline getline -参看课本参看课本p349 p349 47 #includevoidmain()charline81;ifstreaminfile(“getline_1.cpp”);/打开文件用于读打开文件用于读infile.getline(line,80);/读出一行读出一行(至多至多80个字符个字符)放入放入line中中while(!infile.eof()/尚未读到文件结束则继续循环尚未读到文件结束则继续循环(处理处理)coutlin
55、eendl;/显示在屏幕上显示在屏幕上infile.getline(line,80);/再读一行再读一行infile.close();48 10.5text文件与文件与binary文件文件-10.6.1按用户设置的文件形式进行读写按用户设置的文件形式进行读写*以以text形式存储形式存储,优点优点是具有较高的兼容性。是具有较高的兼容性。缺点缺点是是存储一批纯数值信息时,要在数据之间人为地添加分割符;存储一批纯数值信息时,要在数据之间人为地添加分割符;输入输出过程中,系统要对内外存的数据格式进行相应转输入输出过程中,系统要对内外存的数据格式进行相应转换;另外换;另外text文件不便于对数据实行随
56、机访问。文件不便于对数据实行随机访问。49 * * 以以binarybinary形式存储形式存储,优点优点是便于对数据实行随机访是便于对数据实行随机访问(每一同类型数据所占磁盘空间的大小均相同,不必在问(每一同类型数据所占磁盘空间的大小均相同,不必在数据之间人为地添加分割符);输入输出过程中,系统不数据之间人为地添加分割符);输入输出过程中,系统不对数据进行任何转换。对数据进行任何转换。缺点缺点是兼容性低。是兼容性低。 注:由程序员决定将数据存储为注:由程序员决定将数据存储为texttext文件或者文件或者binarybinary文文件两种形式之一。件两种形式之一。 缺省打开方式时,默认为缺省
57、打开方式时,默认为texttext文件形式。若欲使用文件形式。若欲使用binarybinary文件形式,要将打开方式设为文件形式,要将打开方式设为“ios:binaryios:binary”。 通常将纯文本信息(如字符串)以通常将纯文本信息(如字符串)以texttext文件形式存储,文件形式存储,而将数值信息以而将数值信息以binarybinary文件形式存储。文件形式存储。 50 1. 1. 对两种文件进行操作对两种文件进行操作 将将a a数组中准备好的数组中准备好的8 8个个intint型数据,分别通过算符型数据,分别通过算符“”依次写出到依次写出到texttext文件文件ft.txtft
58、.txt之中(注意各数据在文件中之中(注意各数据在文件中“长短长短”不一,且数据间必须加入分割符)。而且还通过不一,且数据间必须加入分割符)。而且还通过使用类成员函数使用类成员函数writewrite将这相同的将这相同的8 8个个intint型数据依次写出到型数据依次写出到binarybinary文件文件fb.binfb.bin之中(注意各数据在文件中之中(注意各数据在文件中“长短长短”相相同,且数据间不需要加入分割符)。同,且数据间不需要加入分割符)。 另外,程序中通过使用无参的成员函数另外,程序中通过使用无参的成员函数“tellp()tellp()”来来获取当前已写出到各文件的位置信息,以
59、确认每一数据在获取当前已写出到各文件的位置信息,以确认每一数据在文件中所占的字节数。文件中所占的字节数。 ostream:tellpostream:tellp之功能为:获取并返回之功能为:获取并返回“输出指针输出指针”的当前位置值(从文件首到当前位置的字节数)。的当前位置值(从文件首到当前位置的字节数)。 51 #includevoidmain()inta8=0,1,-1,1234567890;for(inti=4;i8;i+)ai=876543210+i-4;/均由均由9位数字组成,在位数字组成,在text文件中所占字节数也为文件中所占字节数也为9ofstreamft(ft.txt);ofs
60、treamfb(fb.bin,ios:binary);for(i=0;i8;i+)ftai;/数据间需要添加分割符数据间需要添加分割符fb.write(char*)(&ai),sizeof(ai);/数据间不需分割符数据间不需分割符coutft.tellp()=ft.tellp(),;/当前当前ft文件位置文件位置coutfb.tellp()=fb.tellp()endl;/当前当前fb文件位置文件位置ft.close();fb.close();52 程序执行后的输出结果如下:程序执行后的输出结果如下:ft.tellp()=2,fb.tellp()=4ft.tellp()=4,fb.tellp()=8ft.tellp()=7,fb.tellp()=12ft.tellp()=18,fb.tellp()=16ft.tellp()=28,fb.tellp()=20ft.tellp()=38,fb.tellp()=24f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中职环境运营管理(管理技术)试题及答案
- 2025年中职(网络安防系统安装与维护)监控系统安装阶段测试试题及答案
- 2025年高职小学教育(小学教学方法)试题及答案
- 2025年中职工业设计(产品创新设计)试题及答案
- 2025年高职播音与主持(节目主持)试题及答案
- 2025年大学大一(动物科学)动物解剖学试题及答案
- 2025年大学教育学(教育技术研发)试题及答案
- 2025年高职计算机网络技术(网络故障排除)试题及答案
- 2025年大学工业机器人技术(编程优化)试题及答案
- 2025年中职第三学年(电子技术应用)电子管理专项试题及答案
- 2026年七年级历史上册期末考试试卷及答案(共六套)
- 2025年全载录丨Xsignal 全球AI应用行业年度报告-
- 资产评估期末试题及答案
- 2025年内科医师定期考核模拟试题及答案
- 郑州大学《大学英语》2023-2024学年第一学期期末试卷
- 校企合作工作室规范管理手册
- 雨课堂在线学堂《西方哲学-从古希腊哲学到晚近欧陆哲学》单元考核测试答案
- IPC7711C7721C-2017(CN)电子组件的返工修改和维修(完整版)
- 学堂在线 雨课堂 学堂云 研究生学术与职业素养讲座 章节测试答案
- 博士课程-中国马克思主义与当代(2024年修)习题答案
- DBJ41∕T 174-2020 城市房屋建筑和市政基础设施工程及道路扬尘污染防治标准-(高清版)
评论
0/150
提交评论