c上课PPT课件_第1页
c上课PPT课件_第2页
c上课PPT课件_第3页
c上课PPT课件_第4页
c上课PPT课件_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1珍惜了,才成长了作文岁月不停流逝,需要珍惜的,又有些什么?题记雨雪纷飞,隐入眉间。我独自伫立在河边,望着已经结冰的河面,却看到了冰下的生机。你,是否也懂得珍惜?小时候,总听大人们说,成长总要舍弃一些。那时候,我总在想,为什么不可以在珍惜中成长?后来,我长大了,小时候的话也随风飘散,我变了,再也不肯牵父母的手,总以为他们可有可无。直到那一天,父亲要出远门,我想,我该高兴。泪,却渐渐滑落。终于,在我父母诧异的目光下,说出了多年未说出口的那句话:“我爱你。”父亲,哭了。我却抹掉泪水,笑着抱住了他。成长,需要珍惜眼前人。我喜欢看日出。深处的早晨,我爱坐在山头,看阳光洒满大地。天,还有些暗,遥远的天边

2、,甚至还有几颗星在闪烁。我静静的等着。秋风有些萧瑟。这是我来看日出的第几日了?好像数不清了。自从回到故乡,这个习惯我一直坚持着。望着在风中舞动的谷穗,突然有了些许感动,他们与风雨拼搏了多少次,才赢得我们一口粮食?我们为何还不好好珍惜?太阳出来了,谷穗又看到了生命的希望。阳光给经受摧残的林间送来了勃勃生气。第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

3、 字符串流10.7 10.7 其他输入输出控制函数第1页/共66页210.1 10.1 文件、流以及C+C+的流类库- - 参看书参看书p325p3251 1 流类库的优点流类库的优点 用用C+C+语言自己的支持语言自己的支持I/O I/O 操作的流类库代替操作的流类库代替printf printf 函数族,是一个明显的进步函数族,是一个明显的进步 (1 1)简明与可读性)简明与可读性 I/O I/O 语句更为简明,增加了可读性语句更为简明,增加了可读性(2 2)类型安全()类型安全(type safetype safe)所谓类型安全,是指在进行所谓类型安全,是指在进行I/O I/O 操作时不

4、应对于参加操作时不应对于参加输入输出的数据在类型上发生不应有的变化输入输出的数据在类型上发生不应有的变化 (3 3)易于扩充)易于扩充第2页/共66页32 2 文件与流的概念 C+ C+语言中的输入输出操作语言中的输入输出操作( (功能功能) )是由它所预是由它所预定义的诸定义的诸I/OI/O流类的一个类库所提供的。流类的一个类库所提供的。 1. 1. 流流( (Stream)Stream) 流流( (stream)stream)是一个逻辑概念是一个逻辑概念,它是,它是C+C+语言对语言对所有外部设备的逻辑抽象,它所有外部设备的逻辑抽象,它代表的是某种流类类代表的是某种流类类型的一个对象型的一

5、个对象。C+C+的的IOIO系统将每个外部设备都转系统将每个外部设备都转换成一个称为流的逻辑设备,由流来完成对不同换成一个称为流的逻辑设备,由流来完成对不同设备的具体操作。设备的具体操作。第3页/共66页4 2. 2. 文件( (File)File) 文件文件( (File)File)是一个物理概念是一个物理概念,代表存储着信息集合的,代表存储着信息集合的某个某个外部介质外部介质,它是,它是C+C+语言语言对具体设备的抽象对具体设备的抽象。如,磁盘。如,磁盘文件,显示器,键盘(又可以分为文本和二进制文件)。文件,显示器,键盘(又可以分为文本和二进制文件)。 所有流所有流( (类对象类对象) )

6、的行为都是相同的,而不同的文件则可的行为都是相同的,而不同的文件则可能具有不同的行为。如,磁盘文件可进行写也可进行读操作;能具有不同的行为。如,磁盘文件可进行写也可进行读操作;显示器文件则只可进行写操作;而键盘文件只可进行读操作。显示器文件则只可进行写操作;而键盘文件只可进行读操作。 当程序与一个文件交换信息时,必须通过当程序与一个文件交换信息时,必须通过“打开文件打开文件”的操作将一个文件与一个流的操作将一个文件与一个流( (类对象类对象) )联系起来。一旦建立了联系起来。一旦建立了这种联系,以后对该流这种联系,以后对该流( (类对象类对象) )的访问就是对该文件的访问,的访问就是对该文件的

7、访问,也就是对一个具体设备的访问。可通过也就是对一个具体设备的访问。可通过“关闭文件关闭文件”的操作的操作将一个文件与流将一个文件与流( (类对象类对象) )的联系断开。的联系断开。第4页/共66页5 3. 3. C+C+的基本流类库的基本流类库 在头文件在头文件 “ “iostream.h” iostream.h” 中说明中说明( (预定义预定义) )了一批了一批基基本流类本流类: : iosios - - 基本流类的基类基本流类的基类; ; istreamistream - - 由由iosios派生,支持输入派生,支持输入( (提取提取“”)“”)操作;操作; ostreamostream

8、 - - 由由iosios派生,支持输出派生,支持输出( (插入插入“”)“”)操操作;作; iostreamiostream - - 由由istreamistream与与ostreamostream共同派生,支持输共同派生,支持输入和输出双向操作。入和输出双向操作。 第5页/共66页6 C+ C+预定义的流预定义的流有:有: extern istream extern istream cincin; - ; - 对象对象cincin对应于对应于键盘键盘文件文件 extern ostream extern ostream coutcout; - ; - 对象对象coutcout对应于对应于显示

9、器显示器文件文件 extern ostream extern ostream cerrcerr; - ; - 对象对象cerrcerr对应于对应于显示器显示器文件文件 extern ostream extern ostream clogclog; - ; - 对象对象clogclog对应于对应于显示器显示器文件文件 程序中可直接对上述程序中可直接对上述4 4个预定义流类对象进行读写,而个预定义流类对象进行读写,而不必先进行不必先进行“打开文件打开文件”的操作,使用完后也不需要进行的操作,使用完后也不需要进行“关闭文件关闭文件”的操作(因为这些流类对象与文件之间的联系的操作(因为这些流类对象与文

10、件之间的联系是预定义好的,可认为系统已为每一程序都隐含进行了对它是预定义好的,可认为系统已为每一程序都隐含进行了对它们的打开与关闭操作)。们的打开与关闭操作)。 第6页/共66页7 4. C+ 4. C+的文件流类库的文件流类库 在头文件在头文件“fstream.h”fstream.h”中说明中说明( (预定义预定义) )了一批了一批文件流文件流类类,专用于,专用于磁盘文件磁盘文件: : ifstreamifstream - - 由由istreamistream派生,支持从磁盘文件中输派生,支持从磁盘文件中输入入( (读入读入) )数据;数据; ofstreamofstream - - 由由o

11、streamostream派生,支持往磁盘文件中派生,支持往磁盘文件中输出输出( (写出写出) )数据;数据; fstreamfstream - - 由由iostreamiostream派生,支持对磁盘文件进行派生,支持对磁盘文件进行输入和输出数据的双向操作。输入和输出数据的双向操作。 C+C+中没有预定义的文件流中没有预定义的文件流( (类对象类对象) ),程序中用到,程序中用到的所有文件流类对象都要进行自定义。的所有文件流类对象都要进行自定义。第7页/共66页8* *10.2 10.2 插入与提取运算符的重载 - - 参看书参看书p329p329对自定义类对自定义类complexcompl

12、ex重载输入输出运算符重载输入输出运算符“”“”“”:#includeclass complex double r; double i;public:complex(double r0=0, double i0=0) r=r0; i=i0; complex operator +(complex c2); complex operator *(complex c2); friend istream& operator (istream& in, complex& com); friend ostream& operator ”operator”用于完成从用于完成从

13、istreamistream类的流类对象类的流类对象inin上上(如对应实参可为(如对应实参可为cincin,即 指 定 从 键 盘 上 ) 输 入 一 个 复 数 的 有 关 数 据 放 入即 指 定 从 键 盘 上 ) 输 入 一 个 复 数 的 有 关 数 据 放 入complexcomplex型引用对象型引用对象comcom中;而中;而“operator”operator”则用于实现往则用于实现往ostreamostream类类的流类对象的流类对象outout上(如对应实参可为上(如对应实参可为coutcout,即指定往屏幕上)输出即指定往屏幕上)输出complexcomplex类对象

14、类对象comcom的有关数据。的有关数据。 3.3. 本程序重载的输入输出运算符的返回类型均为引用,为的是可使用返回本程序重载的输入输出运算符的返回类型均为引用,为的是可使用返回结果继续作左值,也即使返回结果能起到一个独立对象(变量)的作用,从而可结果继续作左值,也即使返回结果能起到一个独立对象(变量)的作用,从而可使用像使用像“coutc1c2;”coutc1c1c2;”cinc1c2;”这样的调用语句。另外,这样的调用语句。另外,“operator ”operator ”的第二形参的第二形参comcom也必须被说明成引用也必须被说明成引用“complex& com”complex&

15、amp; com”,目的则是要将输入数据直接赋值给对应实参变量(所拥有的存储空间中)。目的则是要将输入数据直接赋值给对应实参变量(所拥有的存储空间中)。第9页/共66页10 complex complex:operator +(complex c2) complex c;c.r=r+c2.r;c.i=i+c2.i;return c; complex complex:operator * (complex c2) complex temp;temp.r=(r*c2.r)-(i*c2.i);temp.i=(r*c2.i)+(i*c2.r);return temp;第10页/共66页11istrea

16、m& operator (istream& in, complex& com) incom.rcom.i;return in; /不可缺少,因为函数返回类型为不可缺少,因为函数返回类型为“istream&” ostream& operator (ostream& out, complex com) out(com.r, com.i)endl;return out; /不可缺少,因为函数返回类型为不可缺少,因为函数返回类型为“ostream&”void main() complex c1(1,1), c2(2,3), c3, res;cou

17、tc1=c1c2=c2;res = c1+c2;coutc1+c2=res;coutc1*c2=c1*c2;第11页/共66页12 coutc3; coutc3+c3=c3+c3; /* 注意输入输出语句中出现的注意输入输出语句中出现的类对象类对象cout以及以及cin正是正是输入输入输出重载函数中输出重载函数中引用型形参引用型形参out以及以及in的对应实参的对应实参。即是说,。即是说,若使用若使用“coutc1;”它将等同于它将等同于“operatorc3;”则等同于使用则等同于使用“operator(cin, c3);”。 */ 程序执行后,屏幕显示结果为:程序执行后,屏幕显示结果为:

18、c1=(1, 1)c2=(2, 3)c1+c2=(3, 4)c1*c2=(-1, 5)Input c3:3 -5c3+c3=(6, -10)第12页/共66页1310.3 10.3 I/OI/O的格式控制1 1 格式控制函数及格式控制符 2 2 I/OI/O格式控制示例 第13页/共66页141 1 格式控制函数及格式控制符 1. 1. iosios类中常用的公有格式控制成员函数类中常用的公有格式控制成员函数 在在iosios类中定义了一批公有的类中定义了一批公有的格式控制标志位格式控制标志位以及一些以及一些成员函数,通常先用某些成员函数来设置标志位,然后再使用成员函数,通常先用某些成员函数来

19、设置标志位,然后再使用另一些成员函数来进行格式输出。另外,另一些成员函数来进行格式输出。另外,iosios类中还设置了一个类中还设置了一个longlong型的数据成员用来记录当前被设置的格式状态,该数据型的数据成员用来记录当前被设置的格式状态,该数据成员被称为成员被称为格式控制标志字格式控制标志字( (或标志状态字或标志状态字) )。标志字是。标志字是由格式由格式控制标志位来控制标志位来“合成合成”的。的。 注意,注意,iosios类作为诸多类作为诸多I/OI/O流类的基类,其公有成员函数流类的基类,其公有成员函数当然可被各派生类的对象所直接调用。当然可被各派生类的对象所直接调用。第14页/共

20、66页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 每一枚举常量值都代表着格式控制标志字中的某一个二进制每一枚举常量值都代表着格式控

21、制标志字中的某一个二进制位位( (bit)bit),当设置了某个标志位属性时,该位将取值当设置了某个标志位属性时,该位将取值“1”“1”,否,否则该位取值则该位取值“0”“0”。 第15页/共66页16 另外注意,通过另外注意,通过使用位运算符使用位运算符“|”“|”可将多个格式控可将多个格式控制标志位属性进行制标志位属性进行“合成合成”。但从使用角度看,。但从使用角度看,所设置所设置的标志位属性不能产生互斥的标志位属性不能产生互斥。例如,格式控制标志字中设。例如,格式控制标志字中设立了三个平行的标志位立了三个平行的标志位( (ios:decios:dec、ios:octios:oct和和io

22、s: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,这些互斥属性也不能同时这些互斥属性也不能同

23、时设置。设置。 b.b. 格式二格式二: : long flags(); long flags(); 返回当前的标志字。返回当前的标志字。 第16页/共66页17 (2) ios:setf(2) ios:setf a.a. 格式一格式一: : long setf( long lFlags ); long setf( long lFlags ); 通过参数通过参数lFlagslFlags来设置指定的格式控制标志位。来设置指定的格式控制标志位。 注意,与注意,与flagsflags函数的函数的“替换替换”方式不同,此处为方式不同,此处为“添添加加”方式,即是说,它并不更改其它方式,即是说,它并不更

24、改其它lFlagslFlags不涉及到的那些不涉及到的那些标志位的当前值。标志位的当前值。 b.b. 格式二格式二: : long setf( long lFlags, long lMask );long setf( long lFlags, long lMask ); 设置指定的格式控制标志位的值(首先将第二参数设置指定的格式控制标志位的值(首先将第二参数lMasklMask所指定的那些位清零,而后用第一参数所指定的那些位清零,而后用第一参数lFlagslFlags所给定的值所给定的值来重置这些标志位)。来重置这些标志位)。 第17页/共66页18 例如,为保障所设置的数制标志位不产生互斥,

25、当要设例如,为保障所设置的数制标志位不产生互斥,当要设置置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:floatfiel

26、d); 其 中 用 到 了 公 有 静 态 常 量其 中 用 到 了 公 有 静 态 常 量i o s : : a d j u s t f i e l d 和和ios:floatfield。 i o s : : a d j u s t f i e l d的取值为的取值为ios:left|ios:right|ios:internal,而而ios:floatfield的取值为的取值为ios:scientific|ios:fixed。 第18页/共66页19 (3) ios:unsetf(3) ios:unsetf long unsetf( long lFlags );long unsetf( lo

27、ng lFlags ); 通过参数通过参数lFlagslFlags来清除指定的格式控制标志位。来清除指定的格式控制标志位。 (4) (4) ios:fillios:fill char fill( char cFill ); char fill( char cFill ); 将将“填充字符填充字符”设置为设置为cFill, cFill, 并返回原并返回原“填充填充字符字符”。 第19页/共66页20(5) ios:precision(5) ios:precision int precision( int np );int precision( int np ); 设置浮点数精度为设置浮点数精度为

28、npnp并返回原精度。当格式为并返回原精度。当格式为ios:scientificios:scientific或或ios:fixedios:fixed时,精度时,精度npnp指小数点后的指小数点后的位数,否则指有效数字。位数,否则指有效数字。 (6) (6) ios:widthios:width int width( int nw );int width( int nw ); 设置当前被显示数据的域宽设置当前被显示数据的域宽nwnw并返回原域宽。默认并返回原域宽。默认值为值为0 0,将按实际需要的域宽进行输出。此设置只对随后的,将按实际需要的域宽进行输出。此设置只对随后的一个数据有效,而后系统立

29、刻恢复域宽为系统默认值一个数据有效,而后系统立刻恢复域宽为系统默认值0 0。第20页/共66页21 2. 2. 常用的输入输出格式控制符常用的输入输出格式控制符 可直接用于提取和插入算符可直接用于提取和插入算符(“”(“”和和“”)“”)之后,之后,而不像格式控制成员函数那样必须被单独调用。而不像格式控制成员函数那样必须被单独调用。 (1) (1) 中含有的无参格式控制符中含有的无参格式控制符( (参看参看p337)p337): . endl. endl. ends. ends. flush. flush. ws. ws. dec. dec. hex. hex. oct. oct第21页/共6

30、6页22 中含有的有参格式控制符中含有的有参格式控制符 . setbase( int base ) . setbase( int 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 ). s

31、etw( int nw )第22页/共66页232 2 I/OI/O格式控制示例 1. 格式控制示例一格式控制示例一 ( flags和和setf等函数的功能等函数的功能) #include void main() coutios basefield; /输出:输出:112 cout (ios:dec|ios:oct|ios:hex)endl; /输出:输出:112 coutios:adjustfield; /输出:输出:14 cout (ios:left|ios:right|ios:internal)endl; /输出:输出:14 coutios:floatfield; /输出:输出:6144

32、 cout (ios:scientific|ios:fixed)endl; /输出:输出:6144第23页/共66页24/flags将重新设置标志字,将重新设置标志字,“替换替换”方式方式 cout.flags(ios:showbase); coutcout.flags()endl; /输出:输出:128 cout.flags(ios:showpoint); coutcout.flags()endl; /输出:输出:256 cout.unsetf(ios:showpoint); coutcout.flags()endl; /输出:输出:0 /setf为为“添加添加”方式方式 cout.setf

33、(ios:showbase); coutcout.flags()endl; /输出:输出:128 cout.setf(ios:showpoint); coutcout.flags()endl; /输出:输出:384 cout.unsetf(ios:showpoint); coutcout.flags()endl; /输出:输出:128 第24页/共66页252. 格式控制示例二格式控制示例二 对输出数据的宽度、精度等方面进行设置与使用。对输出数据的宽度、精度等方面进行设置与使用。#include void main() cout.width(6); /只管随后一个数的域宽只管随后一个数的域宽

34、coutsetw(6)4785setw(8)27.4272endlendl; cout.width(6);cout.precision(3); /当格式为当格式为ios:scientific或或ios:fixed时,浮点数精度时,浮点数精度 /np指小数点后的位数,否则指有效数字指小数点后的位数,否则指有效数字 /此时设置浮点数的有效数字为此时设置浮点数的有效数字为3cout4785setw(8)27.4272endl; 第25页/共66页26coutsetw(6)4785setw(8)setprecision(2)27.4272endlendl; / 4785 27 /“setprecisi

35、on(2)”设置浮点数的有效数字设置浮点数的有效数字cout.setf(ios:fixed, ios:floatfield); /今后以定点格式显示浮点数今后以定点格式显示浮点数(无指数部分无指数部分)cout.width(6); cout.precision(3); /当格式为当格式为ios:fixed时,设置小数点后的位数时,设置小数点后的位数cout4785setw(8)27.4272 = 读写操作读写操作 = = 关闭文件关闭文件。 第27页/共66页28 “打开文件打开文件”通常通过构造函数自动完成(也可显式调通常通过构造函数自动完成(也可显式调用成员函数用成员函数openopen完

36、成)。完成)。“关闭文件关闭文件”通常通过使用通常通过使用“.close();”close();”来显式完成。来显式完成。 例例1: 1: ofstream outfile1(myfile1.txt);ofstream outfile1(myfile1.txt); 创建创建ofstreamofstream类的对象类的对象outfile1outfile1;使流类对象使流类对象outfile1outfile1与磁盘文件与磁盘文件 myfile1.txtmyfile1.txt相联系;并打开用于相联系;并打开用于“写写”的磁盘的磁盘文件文件 myfile1.txtmyfile1.txt。 例例2: 2

37、: ofstream outfile1;ofstream outfile1; / /创建创建ofstreamofstream类的对象类的对象outfile1outfile1 outfile1.open(myfile1.txt); outfile1.open(myfile1.txt); / /显式调用成员函数显式调用成员函数openopen来打开文件来打开文件第28页/共66页29 二二. 与创建流类对象相关的三个构造函数与创建流类对象相关的三个构造函数 1. ifstream:ifstream ifstream( const char* szName, int nMode = ios:in,

38、int nProt = filebuf:openprot ); 参数参数: (1) szName - 文件名;文件名; (2) nMode - 打开文件的方式。打开文件的方式。 ios:in - 以读以读(输入输入)为目的打开。为目的打开。 ios:nocreate - 仅打开一个已存在文件。仅打开一个已存在文件。 ios:binary - 打开二进制文件。打开二进制文件。 (3) nProt - 指定所打开文件的保护方式。指定所打开文件的保护方式。第29页/共66页30 2. ofstream:ofstream ofstream( const char* szName, int nMode

39、= ios:out, int nProt = filebuf:openprot ); 参数参数: (1) szName - 文件名;文件名; (2) nMode - 打开文件的方式。打开文件的方式。 ios:out - 以写以写(输出输出)为目的打开文件。为目的打开文件。 ios:trunc - 若文件存在,则将文件长度截为若文件存在,则将文件长度截为0。 ios:binary - 打开二进制文件。打开二进制文件。 ios:app - 以追加方式打开。以追加方式打开。 . (3) nProt - 指定所打开文件的保护方式。指定所打开文件的保护方式。 第30页/共66页31 3. fstream

40、:fstream fstream( const char* szName, int nMode, int nProt = filebuf:openprot ); 参数含义和用法与参数含义和用法与ofstream构造函数处相同。构造函数处相同。 三三. 与创建流类对象相关的三个与创建流类对象相关的三个open函数函数 1. ofstream:open void open( const char* szName, int nMode = ios:out, int nProt = filebuf:openprot ); 2. ifstream:open void open( const char*

41、szName, int nMode = ios:in, int nProt = filebuf:openprot ); 3. fstream:open void open( const char* szName, int nMode, int nProt = filebuf:openprot ); 第31页/共66页3210.4.2 使用插入与提取与算符进行I/O操作 - - 参看书参看书p343p343 对文件的对文件的“读写操作读写操作”通常使用预定义的通常使用预定义的类成员函数类成员函数来来实现(课本节介绍),但也可使用继承而来的实现(课本节介绍),但也可使用继承而来的插入和提取运插入和

42、提取运算符算符“”“”和和“”“”operator ”,所以,所以,ifstreamifstream流(类对象)可以使用预定义的算符流(类对象)可以使用预定义的算符“”“”来对来对自定义磁盘文件进行自定义磁盘文件进行“读读”操作(允许通过派生类对象直操作(允许通过派生类对象直接调用其基类的公有成员函数);接调用其基类的公有成员函数); ofstreamofstream类由类由ostreamostream类所派生类所派生,而,而ostreamostream类中预定类中预定义了公有的运算符义了公有的运算符重载函数重载函数“operator ”operator ”,所以,所以,ofstreamofs

43、tream流(类对象)可以使用预定义的算符流(类对象)可以使用预定义的算符“”“”“”和和“”“”来对自定义磁盘文件来对自定义磁盘文件进行进行“读读” ” 与与“写写”操作。操作。 还有一点需要注意:使用预定义的算符还有一点需要注意:使用预定义的算符“”“”“”来进行来进行“读读”操操作时遇空格或换行均结束一个数据相呼应。作时遇空格或换行均结束一个数据相呼应。 下述下述示例程序示例程序做了如下的做了如下的3 3件事:件事:1)1) 往文件写数据;往文件写数据;2)2) 往文件尾部追加数据;往文件尾部追加数据; 3)3) 从文件读出数据并显示在从文件读出数据并显示在屏幕上。屏幕上。 第33页/共

44、66页34#include void main() /1) 往文件写数据往文件写数据ofstream outfile1(myfile1.txt); /以以“写写”方式打开方式打开outfile1Hello!.CHINA! Nankai_Universityendl; outfile1.close(); /2) 往文件尾部追加数据往文件尾部追加数据 outfile1.open(myfile1.txt, ios:app); /以以“追加追加”方式打开方式打开int x=1212, y=6868;outfile1x ystr1str2; /使用使用“”读读(遇空格、换行均结束遇空格、换行均结束)in

45、file1x2y2;infile1.close(); 第34页/共66页35coutstr1=str1endl;coutstr2=str2endl;coutx2=x2endl;couty2=y2endl; 程序执行后的显示结果如下:程序执行后的显示结果如下:str1=Hello!.CHINA!str2=Nankai_Universityx2=1212y2=6868第35页/共66页36 4.3 使用类成员函数对文件流进行操作1 1 类成员函数getget与putput2 2 类成员函数readread与writewrite3 3 类成员函数getlinegetline 第36

46、页/共66页371 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类中定义

47、的公有成员类中定义的公有成员函数,当然通过其派生类函数,当然通过其派生类ofstreamofstream的类对象也可以直接的类对象也可以直接对它进行调用。同理,通过对它进行调用。同理,通过ifstreamifstream的类对象可以直的类对象可以直接调用接调用getget。第37页/共66页38 1. 程序示例一程序示例一 从键盘输入任一个字符串,通过从键盘输入任一个字符串,通过put将其写到自定义磁盘文件将其写到自定义磁盘文件“putgetfile.txt”中,而后再使用中,而后再使用get从该文件中读出所写串并显示在屏幕从该文件中读出所写串并显示在屏幕上。上。 #include #incl

48、ude void main() /键盘输入字符串,通过键盘输入字符串,通过put将其写到自定义磁盘文件中将其写到自定义磁盘文件中char str80;coutInput string:endl;gets(str);ofstream fout(putgetfile.txt); int i=0;while ( stri ) fout.put(stri+); fout.close();cout-endl;第38页/共66页39 /而后使用而后使用get从文件中读出该串显示在屏幕上从文件中读出该串显示在屏幕上char ch;ifstream fin(putgetfile.txt); fin.get(c

49、h);while(!fin.eof() /从头读到文件结束从头读到文件结束(当前符号非文件结束符时继续当前符号非文件结束符时继续) /注注: 成员函数成员函数eof()在读到文件结束时方返回在读到文件结束时方返回true coutch; fin.get(ch);coutendl;fin.close(); 程序执行后的显示结果如下:程序执行后的显示结果如下:Input string:File operating - using put and get, OK! 12345-File operating - using put and get, OK! 12345第39页/共66页40 2. 程序

50、示例二程序示例二 - 对指定文件进行拷贝对指定文件进行拷贝 使用类成员函数使用类成员函数get与与put对指定文件进行拷贝。被拷对指定文件进行拷贝。被拷贝的贝的“源文件源文件”以及拷贝到的以及拷贝到的“目的文件目的文件”的名字与路径的名字与路径均由命令行参数来提供。均由命令行参数来提供。 程序执行结果程序执行结果(若提供的命令行参数为若提供的命令行参数为:mycopy.cpp res_1.cpp): Copy file from mycopy.cpp to res_1.cpp 程序执行结果程序执行结果(若提供的命令行参数个数不对时若提供的命令行参数个数不对时):ERROR ! - supply

51、ing 2 command-line argements ?!第40页/共66页41 #include #include void main(int argc, char* argv) if(argc!=3) /命令行参数个数不对时命令行参数个数不对时 coutERROR ! - supplying 2 command-line argements ?!endl; exit (1); coutCopy file from argv1 to argv2endl; ifstream fin(argv1); /命令行参数命令行参数1作为文件名作为文件名 ofstream fout(argv2); /

52、命令行参数命令行参数2作为文件名作为文件名 char ch; fin.get(ch); while(!fin.eof() /从头读到文件结束从头读到文件结束 fout.put(ch); fin.get(ch); fin.close(); fout.close(); 第41页/共66页42 2 2 类成员函数readread与write write - - 参看书参看书p347p347 通常使用通常使用read与与write对二进制文件对二进制文件(binary file)进行读进行读写。写。 ostream& write( const char* pch, int nCount );

53、功能:将功能:将pch缓冲区中的前缓冲区中的前nCount个字符写出到某个文件个字符写出到某个文件中。中。istream& read( char* pch, int nCount ); 功能:从某个文件中读入功能:从某个文件中读入nCount个字符放入个字符放入pch缓冲缓冲区中(若读至文件结束尚不足区中(若读至文件结束尚不足nCount个字符时,也将立即个字符时,也将立即结束本次读取过程)。结束本次读取过程)。 注意:使用注意:使用write与与read进行数据读写时,不必要在数据进行数据读写时,不必要在数据间再额外间再额外“插入插入”分割符,这是因为它们都要求提供第二实分割符,这是

54、因为它们都要求提供第二实参来指定读写长度。参来指定读写长度。第42页/共66页43 以下的示例程序先使用以下的示例程序先使用write往自定义二进制磁盘文往自定义二进制磁盘文件中写出如下件中写出如下3个个“值值”:字符串:字符串str的长度值的长度值Len(一个正整一个正整数数)、字符串、字符串str本身、以及一个结构体的数据,而后再使用本身、以及一个结构体的数据,而后再使用read读出这些读出这些“值值”并将它们显示在屏幕上并将它们显示在屏幕上。 #include #include void main() char str20=Hello world!;struct stuchar name

55、20;int age;double score; ss=wu jun, 22, 91.5; 第43页/共66页44 coutWRITE to wrt_read_file.binendl;ofstream fout(wrt_read_file.bin, ios:binary); /打开用于打开用于“写写”的二进制磁盘文件的二进制磁盘文件int Len=strlen(str);fout.write( (char*)(&Len), sizeof(int) ); fout.write(str, Len); /数据间无需分割符数据间无需分割符fout.write(char*)(&ss),

56、 sizeof(ss); fout.close();cout-endl;cout- READ it from wrt_read_file.bin -endl;char str280;ifstream fin(wrt_read_file.bin, ios:binary); fin.read( (char*)(&Len), sizeof(int) );fin.read(str2, Len);str2Len=0; 第44页/共66页45 fin.read( (char*)(&ss), sizeof(ss) ); coutLen=Lenendl; coutstr2=str2endl;

57、,ss.age,ss.scoreendl; fin.close(); cout-endl; 程序执行后的显示结果如下:程序执行后的显示结果如下:WRITE to wrt_read_file.bin- READ it from wrt_read_file.bin -Len=12str2=Hello world!-第45页/共66页46 最常用格式为:最常用格式为:istream& getline( char* pch, int nCount, char delim = n ); 功能:从某个文件中读出一行功能:从某个文件中读出一行(至多至多nCount个字符个字符)

58、放入放入pch缓冲区中,缺省行结束符为缓冲区中,缺省行结束符为n。 程序实例程序实例: 读出读出“getline_1.cpp”的各行并显示在屏幕上(如,可的各行并显示在屏幕上(如,可将本源程序存放在将本源程序存放在“getline_1.cpp“文件中)。文件中)。 3 3 类成员函数getline getline -参看课本参看课本p349 p349 第46页/共66页47 #include void main() char line81; ifstream infile(“getline_1.cpp”); /打开文件用于读打开文件用于读 infile.getline(line, 80); /

59、读出一行读出一行(至多至多80个字符个字符)放入放入line中中 while(!infile.eof() /尚未读到文件结束则继续循环尚未读到文件结束则继续循环(处理处理) coutlineendl; /显示在屏幕上显示在屏幕上 infile.getline(line,80); /再读一行再读一行 infile.close();第47页/共66页48 10.5 text文件与文件与binary文件文件- 10.6.1 按用户设置的文件形式进行读写按用户设置的文件形式进行读写 * 以以text形式存储形式存储,优点优点是具有较高的兼容性。是具有较高的兼容性。缺点缺点是存储一批纯数值信息时,要在数

60、据之间人为地添加分是存储一批纯数值信息时,要在数据之间人为地添加分割符;输入输出过程中,系统要对内外存的数据格式进割符;输入输出过程中,系统要对内外存的数据格式进行相应转换;另外行相应转换;另外text文件不便于对数据实行随机访问。文件不便于对数据实行随机访问。第48页/共66页49 * * 以以binarybinary形式存储形式存储,优点优点是便于对数据实行随机是便于对数据实行随机访问(每一同类型数据所占磁盘空间的大小均相同,不必访问(每一同类型数据所占磁盘空间的大小均相同,不必在数据之间人为地添加分割符);输入输出过程中,系统在数据之间人为地添加分割符);输入输出过程中,系统不对数据进行任何转换。不对数据进行任何转换。缺点缺点是兼容性低。是兼容性低。 注:由程序员决定将数据存储为注:由程序员决定将数据存储为texttext文件或者文件或者binarybinary文文件两种形式之一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论