Stream概念(c++).ppt_第1页
Stream概念(c++).ppt_第2页
Stream概念(c++).ppt_第3页
Stream概念(c++).ppt_第4页
Stream概念(c++).ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章 I/O流,8.1 C+流的概念 8.2 C+的输入输出 8.3 文件流与文件操作 8.4 重载插入运算符和提取运算符 8.5 编程实例,8.1 C+流的概念,C+流是指信息在内存与外部设备之间传递(流动)的过程。 C+流程及以下概念: l 标准I/O流:内存与标准输入输出设备之间信息的传递; l 文件I/O流:内存与外部文件之间信息的传递; l 字符串I/O流:内存变量与表示字符串流的字符数组之间信息的传递。,每一种I/O流都分为输入、输出和既输入又输出三种流动方式。各流动方式的流动方向如下: l 输入:从外部向内存变量流动; l 输出:从内存变量向外部流动; l 既输入又输出:内存和

2、外部之间允许双向流动。 在C+流类库中定义有各种流类供用户直接使用,它们分别包含在不同的头文件中:,l iostream.h包含ios, istream, ostream, iostream等; l fstream.h包含ifstream, ofstream, fstream及iostream.h中的所有内容; l strstrea.h包含istrstream, ostrstream, strstream及iostream.h中的所有内容。 流类库员列表如表8.1所示。,表8.1 流类库成员列表,在iostream.h 头文件中定义有cin、cout和cerr等流类对象,分别表示标准输入设备键

3、盘、标准输出设备显示器和保存错误信息的设备显示器。标准设备见表8.2。,表8.2 标准设备数,8.2 C+的输入输出,输入/输出流可以从文件或设备中读出或写入数据,C运行库提供了两种输入/输出功能: (1) 把数据作为单字符流处理。可以处理简单的数据,也可以处理复杂的数据结构。 (2) 直接调用操作系统的底层功能实现输入/输出操作。 这两种输入/输出功能都含文件和标准的输入/输出功能。这里着重讨论流类的标准输入/输出、标准错误输出以及文件输入/输出。,8.2.1 标准输入输出 C+用istream_withassign类和ostream_withassign类来实现标准输入/输出功能。标准输入

4、与输出是指读键盘的数据和将数据输出到屏幕。 在iostream.h文件中用以下两条语句定义cin和cout两个标准对象: istream_withassign cin ; ostream_withassign cout ;,8.2.2 标准错误输出cerr 当程序测试并处理关键错误时,若不希望程序的错误信息从屏幕显示,而是重定向到其它地方,这时使用cerr流显示信息。 例8.1 在除法操作不能进行时显示一条错误信息。 #include void fn(int a,int b) ,if(b=0) cerr zero encountered. The message can not be redi

5、rected. ; else cout a /b endl ; void main() fn(20,2); fn(20,0); ,运行结果为: 10 zero encountered . The message can not be redirected . 说明:主函数第一次调用fn()函数时,没有碰到除0运算,于是得到文件的写内容10,第二次调用fn()函数时,碰到了除0运算,于是在屏幕上输出错误信息。写到cerr上的信息是不能被重定向的,因此它只能在屏幕上显示。,8.2.3 输入/输出格式控制 在程序中有时需要关心输入/输出的格式,C提供了两种格式控制函数:一种是ios类中定义的格式控制

6、成员函数;另一种是基于流对象的操纵函数。相比之下,使用操纵函数更为方便。 1. ios类中定义的格式控制标志 ios类中定义了一个数据成员和一个格式控制标志字long x_flags。x_flags的每一位的状态值用枚举符号常量定义,其具体含义如下:,enum skipws = 0 x0001 , /跳过输入空格 left = 0 x0002 , /按左对齐格式输出 right = 0 x0004 , /按右对齐格式输出 internal = 0 x0008 , /输出符号和基指示符后的填补 dec = 0 x0010 , /转换为十进制(In / Out) oct = 0 x0020 , /

7、转换为八进制(In / Out) hex = 0 x0040 , /转换为十六进制(In / Out) showbase = 0 x0080 , /输出显示基指示符,showpoint = 0 x0100 , /输出显示小数点 uppercase = 0 x0200 , /大写十六进制输出 showpos = 0 x0400 , /正整数显示前加上“” scientific = 0 x0800 , /输出用科学表示法表示的浮点数 fixed = 0 x1000 , /输出用固定小数点表示的浮点数 unitbuf = 0 x2000 , /在输出操作后刷新所有流 stdio = 0 x4000

8、/在输出操作后刷新stdout和stderr 这些标志可以由ios类的成员函数flags()、setf()和unsetf()访问,也可以用操纵函数操作。,2. 操纵函数和操纵符 操纵函数分为带参数和不带参数两种。不带参数的操纵函数又叫操纵符,定义在头文件iostream.h中,带参数的操纵函数定义在头文件iomanip.h中。Fostream.h中的操纵符如表8.3所示。Jomanip.h中的操纵函数如表8.4所示。,表8.3 iostream.h中的操纵符,表8.4 iomanip.h中的操纵函数,例8.2 操纵符(函数)的使用。 #include void main() int x=56;

9、 coutsetw(6)x; coutsetw(6)octx; coutsetw(6)hexxendl; cout.setf(ios:left); coutsetw(6)decx;,coutsetw(6)octx; coutsetw(6)hexxendl; cout.unsetf(ios:left); coutsetw(6)decx; coutsetw(6)octx; coutsetw(6)hexxendl; 运行结果为: 56 70 38 56 70 38 56 70 38,8.3 文件流与文件操作,8.3.1 标准库文件函数输入/输出 标准C+兼容C语言的文件输入输出功能,它们是以函数的形

10、式给出的。常用的文件输入/输出函数有fopen、fclose、fwrite和fread等。 标准的C库文件输入输出函数定义在stdio.h头文件中,并且定义了一个FILE型文件结构。,在每一个文件被打开时,都有一个FILE型文件指针与之关联,以便保存文件的相关信息,完成文件的读写操作。 对文件的操作一般分为3个步骤: l 使用文件打开函数打开文件,并与文件指针建立关系; l 利用文件指针和写文件、读文件函数对文件进行操作; l 使用文件关闭函数后再关闭文件。 1. 打开文件函数fopen 可使用fopen函数完成文件操作第一步,该函数定义为: FILE *fopen(const char *

11、filename,const char * mode);,其中,参数filename是文件名字符串,mode为文件打开的模式。使用fopen函数时应注意: (1) 返回值是返回打开文件的指针,如果文件不存在或者不能找到文件,则fopen调用返回空指针(NULL),表示文件打开失败。,(2) 参数mode可取以下值: l “r”:以只读方式打开文件; l “w”:以写方式打开文件,如果文件已经存在,其内容将被破坏; l “r+”:用读和写的方式打开文件(文件必须已经存在,否则将导致异常); l “w+”:用读和写的方式打开一空文件,如果该文件已经存在,其内容将被破坏; l “a+”:为了读文件和

12、附加新内容而打开文件; l “t”:以以文本方式打开文件; l “b”:以二进制方式打开文件。,2. 文件读写函数fread和fwrite 第二步操作就是要对文件进行读和写数据。一般常用fread函数和fwrite函数完成该步操作,它们的使用格式为: size_t fread(void * buffer,size_t size, size_t count,FILE * stream); size_t fwrite(const void * buffer, size_t size, size_t count, FILE * stream); 使用fread和fwrite函数时应注意以下几点: (

13、1) fread函数读文件后返回文件数据记录的数目。 (2) fwrite函数写文件后返回实际写入文件数据记录的数目。,(3) 参数buffer指向数据缓冲区。fread函数将读出的数据放在缓冲区中供程序使用;fwrite函数将待写入文件的数据放在缓冲区中以便写入文件。 (4) size为从文件中读出和写入文件的字节数。 (5) count为一次从文件读出数据的最大记录数和一次写入文件的最大记录数。 (6) stream为文件结构指针,在fread函数中为打开文件的指针;在fwrite函数中为把数据要写入文件的指针。,3. 关闭文件函数fclose 可以使用fclose完成第三步操作,该函数的

14、使用格式为: int fclose(FILE * stream); /关闭流文件 int _fcloseall(void); /关闭所有流文件 使用fclose函数时应注意以下几点: (1) fclose函数返回值为0时表示文件关闭成功,否则返回值为非0。 (2) fcloseall成功关闭所打开的文件时,函数返回值为关闭文件的总数。 (3) fclose函数的参数为指向FILE结构体的指针。,例8.3 建立一个名为FREAD.OUT的文件并写入25个字符,然后从该文件中读出这25个字符,输出到屏幕上。 #include void main() FILE * stream; char list

15、30; int i,numread,numwritten;,/按文本模式打开文件并写数据 if(stream = fopen(FREAD.OUT,W+T)!=NULL) for(i = 0;i 25;i+) listi = (char)( z- i); numwritten = fwrite(list ,sizeof(char),25,stream); printf(Write %d itemsn,numwritten); fclose(stream); else printf(problem opening the filen);,/读出25个字符 if(stream fopen(fread

16、.out,r+t)!=NULL); numread = fread(list,sizeof(char),25,stream); printf(Number of items read = %dn,numread); printf(Contents of buffer = %.25sn,list); fclose(stream); else printf(File could not be openedn); ,运行结果为: Write 25 items Number of items read = 25 Contents of buffer = zyxwvutsrqponmlkjihgfedc

17、b,8.3.2 文件输入/输出流 在C中,对文件的输入/输出操作提供了另一种操作方式,即流类库的文件操作,这些类是ofstream与ifstream文件输入/输出流类。对文件的操作也需要8.3.1节讲述的三个步骤。 1. 文件的输出 文件的输出由ofstream完成。ofstream由ostream类继承而来,并继承了它的操作,因此可以利用ofstream重载的操作符把数据写入文件流中。进行文件输出时首先要创建文件输出流ofstream类的一个对象。ofstream类的构造函数用于在不同情况下构造文件流。,ofstream类构造函数的定义如下: ofstream(); ofstream(con

18、st char * filename,int mode=ios:out,int prot=filebuf:openprot); 1) 文件的打开 第一个构造函数用于构造一个不带参数的流,如果需要可以再用它的open函数打开一个文件。open函数的定义如下: void open(const char * filename,int filemode = ios:out,int access = filebuf: openprot);,open函数需要三个参数:第一个参数为字符串,即打开文件的文件名;第二个参数为文件模式,缺省为ios:out,表示按输出方式打开,其它文件操作模式见表8.3;第三个参

19、数为文件的保护方式,有8种取值,其中,0表示普通文件,1表示只读文件,2表示隐含文件,4表示系统文件,以及它们的组合。例如,打开一个test1.dat文件可用如下语句: ofstream afile(); afile.open(test1.d 或 afile.open(test1.dat,ios:out|ios:binary);,表8.5 文件操作方式,第二个构造函数可以在创建文件时通过第一个参数直接指定文件名,第一、第三个参数同上述open函数参数。 可用如下语句打开一个test1.dat文件: ofstream afile(test1.dat); ofstream afile(test1,

20、ios:noreplace); ofstream afile(test1,ios:append); ofstream afile(test1,ios:out|ios:binary);,2) 文件的数据写入函数 ofstream类是从ostream类继承而来的,因而可以使用ostream类的写数据函数和操作符把数据写入文件。写数据函数的原型如下: /写入字符 inline ostream /将字符串str的内容写入到文件,ostream,3) 文件的关闭函数 ofstream类也是从fstreambase类继承的,因而可以使用fstreambase类的close();来关闭文件。 2. 文件的输

21、入 文件的输入由类ifstream完成,它由iostream和fstreambase类继承而来,并继承了fatreambase类的操作符函数以及文件打开、从文件中读数据和关闭文件的函数。ifstream也提供了两构造函数: 第一个为: ifstream();,第二个为: ifstream(const char * filename,int mode = ios:in,int prot = filebuf:openprot); 1) 文件的打开 第一个构造函数用于构造一个不带参数的流,如果需要可以在用它的open函数打开一个文件。open函数的定义如下: void open(const char

22、 * filename,int filemode=ios:in,int access=filebuf:openprot); 第一个构造函数使用与第二个构造函数相同的文件名打开输入文件。,2) 文件的数据读出函数 可以使用istream类的读数据的函数和操作符从文件中读取数据,下面是读数据函数的原型。 /将文件数据读取到字符串内 inline istream,/将文件数据读取到字符内 istream,/将文件数据读取到字符串内 istream 3) 文件的关闭函数 ifstream类也是从fstreambase类继承的,可以使用fstreanmbase类的close();来关闭文件。,3. 字符

23、文件操作举例 例8.4 将100以内的所有奇数存入字符文件a:wr1.dat中。 #include #include void main(void) ofstream f1(a:wr1.dat); /定义输出文件流,并打开相应文件 for(int i=1;i100;i+=2) f1i ; /向f1文件流输出i值 f1.close(); /关闭f1所对应的文件 ,例8.5 从字符文件a:wr1.dat中依次读出每个整数并按6个一行显示出来。 #include #include void main(void) ifstream f1(a:wr1.dat, ios:in | ios:nocreate

24、); int x,i=1;,while(f1x) if(i+%6) coutx ; else coutxendl; coutendl; f1.close(); ,运行结果为: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99,例8.6 使用istream和ostream类的文件操作函数把文件file.in的内容拷贝到文件file.out中。 #include

25、 #include #include void main() char ch; ifstream fin(file.in); /创建一个输入流,并与输入文件file.in联系,ofstream fout(file.out); /创建一个输出流,并与输出文件file.out联系 if(!fin) cerrCant open file file.in; exit(-1); /如果源文件出错,显示出错信息并退出 ,if(!fout) cerrCant open file file.out; exit(-1); /如果目的文件出错,显示出错信息并退出 while(fout ,8.4 重载插入运算符和提

26、取运算符,使用传统的C语言中的printf和scanf等输入函数编写的程序,当输入输出的数据类型发生变化时,必须重写所有的输入输出代码。使用C+流类后,这个问题不复存在,C+可以利用流类对象cin和cout的成员函数重载任意类的输入/输出操作。,流的输入运算符“”又称提取运算符,流的输出运算符“。重载的操作符用于输入Date类的成员变量。由于重载的函数需要访问Date类的私有成员和保护成员,因此应该把这些重载的函数定义为Date类的友元。,例8.7 在用户定义的Date数据类中对流类运算符进行重载。 #include class Date int mo,da,int y; public: Date(int m,int d, int y)mo=m;da=d;yr=y; friend ostream,friend istream,return is; /返回流的引用 void main() int mo,da,yr; Date dt(7,1,1997); cout mo da yr ; Date otherdt(mo,da,yr); cout otherdt endl; ,从这个例子可以看出,只要定义好了某个类的输入/输出操作符重载,就能很容易地进行此类输入和输出操作,这正是C的一个重要的优点。重载的操作符

温馨提示

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

评论

0/150

提交评论