输入输出流类_第1页
输入输出流类_第2页
输入输出流类_第3页
输入输出流类_第4页
输入输出流类_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

1、第11章 输入输出流类1外部设备可分为人机交互设备和存储设备两个大类。人机交互设备主要指键盘、显示器等终端控制台设备和打印机。存储设备指磁带、磁(软、硬)盘、光盘等以文件形式存储持久数据的设备。2早期程序设计语言中通常以文件方式来统一人机交互设备和存储设备的输入输出操作。即将人机交互设备当作一种特殊文件对待。 以文件方式统一管理外部设备可以屏蔽实际物理设备的差异,有利于整体上简化程序设计语言与外部设备交换信息的处理过程。3C+语言对输入输出的处理引入了“流”这个比文件抽象程度更高的概念。输入输出操作被看作数据在源设备对象与目标设备对象之间的流动。C+中完成输入输出操作的类称为流类,并提供了可重

2、用的流类库。411. 1 C+流库结构标准ANSI C程序中的绝大部分工作是由ANSI C标准库中的printf,scanf完成的,I/O功能作为ANSI C标准库功能的一部分被提供。在C+中iostream库提供了printf、scanf功能的替代方法,输入输出功能的实现由一个iostream对象完成。51 流缓冲区类在C+I/O类库定义文件iostream.h中有一个streambuf类,它用来提供物理设备的接口。缓冲区由一段预留的字符存储空间和两个指针组成,两个指针分别指向字符要被插入或被取出的位置。 streambuf类定义了一组缓冲或处理流的通用方法,诸如设置缓冲区,移动指针,存、取

3、字符等。 conbufstrstreambufstreambuf图11.1 流缓冲区类的派生关系C+ I/O流类的结构(1)6streambuf类有三个派生类,其中: (1) conbuf在constream.h中定义,提供光标控制、清屏,定义活动窗口等控制台操作接口和I/O缓冲区管理功能。 (2) 在fstream.h中定义,它用来维护文件缓冲区的打开,关闭,读、写,建立磁盘文件的内存代理。 (3)strstreambuf在strstream.h中定义,提供在内存进行提取和插入操作的缓冲区管理。72 输入输出流类iostream.h中还有以ios类为基类的一组流类的定义。 ios类及其派生类

4、均含有一个指向streambuf类的指针。通过streambuf类代理物理设备的操作。从类ios开始,逐级派生,形成了较为复杂的结构,要很好地使用C+流类,必须逐级了解其父类的public、和protected类型的成员函数、成员变量。8istream_withassignostream_withassignstrstreambaseifstreamistrstreamofstreamostrstreamfstreamstrstreamiostreamiostream_ withassign istreamostreamfstreambaseios图11.2 ios类的派生关系C+ I/O流类

5、的结构(2)9流类分类流类名称流类作用流基础类ios所有流类的父类、保存流的状态并处理错误输入流类istream输入流基础类、将流缓冲区中的字符作格式化和非格式化之间的转换,并输入。ifstream文件输入流类istream_withassign为cin输入流类即操作符输入流istrstream串输入流类输出流类ostream输出流的基础类、将流缓冲区中的数据格式化或非格式化转换,并输出。ofstream文件输出流类ostream_withassigncout,cerr,clog输出的流类即操作符” “”进行了重载,用于完成对各种简单数据类型的输入和输出。 1311.2.2格式化的输入输出C+

6、提供了两种格式控制函数用来控制输入输出的格式:ios类中定义的格式控制成员函数基于流对象的操纵函数。相比之下操纵函数使用更为方便。下面重点介绍操纵函数的概念和用法。141ios 类中定义的格式控制标志ios 类中定义了一个数据成员:格式控制标志字long x_flags。x_flags每一位的状态值用枚举符号常量定义。enum skipws =0 x0001, /跳过输入空格 left =0 x0002, /输出左对齐调整 right =0 x0004, /输出右对齐调整 internal =0 x0008, /输出符号和基指示符后的填补 dec =0 x0010, /转换为十进制 (in/o

7、ut) oct =0 x0020, /转换为八进制 (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;15long x_flags = 0 x0080 = 0000 0000 1000 0000输出显示基指示符long x_flags = 0 x0003 = 0000 0000 0000 0011跳过输入空格 & 输出左对齐调整long x_flags = 0 x0083 = 0000 0000 1000 0011跳过输入空格 & 输出左对齐调整 & 输出显示基指示符long x_flags标志可以由ios类的成员函数 flags(), setf()和unsetf()访问,也可以用操纵函数操作。 162操纵函数和操纵符操纵函数分为带参数和不带参数两种。不带参数的

9、操纵函数又叫操纵符。操纵符定义在头文件iostream.h中,操纵函数定义在头文件iomanip.h中.17表 11.2 iostream.h中的操纵符 操作符用法举例结果说明deccoutdecdecintvar;将整数转化为十进制格式输出将整数转化为十进制格式输入hexcouthexhexintvar;将整数转化为十六进制格式输出将整数转化为十六进制格式输入octcoutoctoctintvar;将整数转化为八进制格式输出将整数转化为八进制格式输入wscinws;忽略输入流中的空格endlcoutendl;插入换行符,刷新流endscoutends;插入串最后的串结束符flushcoutf

10、lush;刷新一个输入流18表 11.3 iomanip.h中的操纵函数 setprecision(int)coutsetprecision(15)输出浮点数精度为6位小数输入浮点数精度为15位小数setw(int)coutsetw(6)setw(24)buf;输出数据宽度为6输入数据宽度为24setiosflags(long)coutsetioflags(ios:oct| ios:skipws)指定数据输出的格式为十六进制格式且用大写字母输出指定数据输入的格式为八进制格式且跳过输入中的空白resetiosflags(long)coutresetiosflags(ios:hex)取消数据输出的

11、格式为十进制格式取消数据输入的格式为十进制格式19例11. 1 操纵符的使用#include #include void main() double values = 1.23, 35.36, 653.7, 4358.24 ; char *names = Zoot, Jimmy, Al, Stan ; cout setiosflags( ios:fixed );/浮点数使用普通记数法表示 for ( int i = 0; i 4; i+ ) cout setiosflags( ios:left) /设置左对齐 setw(6) /设置数据宽度为6位 namesi resetiosflags( i

12、os:left ) /撤消左对齐 setw( 10 ) /设置数据宽度为10位 setprecision(1) /设置浮点数精度1位 valuesi ”又称提取运算符,流的输出运算符”又称插入运算符,它们都可以重载。21例:用户定义的日期Date类的输入输出。为保持和简单类型的输入输出同样的形式,需要为Date类重载操作符。由于重载的函数需要访问Date类的私有的和受保护的成员,应该把这些重载的函数定义为Date类的友元。22#include class Dateint mo, da, yr;public: Date( int m, int d, int y ) mo = m; da = d;

13、 yr = y; friend ostream& operator ( istream& is, Date& dt ); ;ostream& operator( ostream& os, Date& dt ) os dt.mo / dt.da / (istream& is, Date& dt ) is dt.mo dt.dadt.yr; return is; /返回流的引用void main() int mo, da, yr; Date dt( 7,1, 1997 ); coutdtmodayr; Date otherdt( mo, da, yr ); cout otherdt dt_inpu

14、t; cout dt_input endl; 例11. 2 用户定义Date数据类中对流类运算符函数重载23重载操作符函数时应该注意以下几点:重载的操作符函数有两个参数。如果重载的是输出操作符,第一个参数是对流istream类的引用。第二个参数是要定义输入输出类的引用,也可以是此类的指针。运算符重载必须定义为类的友元,因为左操作数必须是流类对象而不是输入/输出类的对象,不能使用隐式左操作数。 24#查询复杂程度复杂数据、有查询对象-关系数据库(ORDB) 简单数据、无查询文本文件简单数据、无查询面向对象数据库(OODB)简单数据、有查询关系式数据库(RDB)2511. 4文件流与文件操作11.

15、4.1 C+ 标准库文件输入与输出标准的C+库提供了文件输入输出功能,它们是以函数的形式给出的。这里将对一些常用的函数如fopen 、fclose 、fwrite、fread等作简要说明。 标准的C库对文件输入输出功能函数定义在 stdio.h 头文件中,并且定义了一个FILE型文件结构,在每一个文件被打开时,都有一个FILE型文件指针与之关联,以便保存文件的相关信息,完成文件的读写操作。26对文件的操作一般分为三个步骤:(1)使用文件打开函数对文件进行打开,并与文件指针建立关系;(2)利用文件指针和写文件、读文件函数对文件进行操作。(3)使用文件关闭函数,对文件关闭。 271 打开文件函数f

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

17、文件和附加新内容而打开文件。 t 以文本方式打开文件。 b 二进制的方式打开文件。 282. 文件读写函数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 );使用时注意:(1)fread 函数读文件返回文件数据记

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

19、ose) int _fcloseall( void ); /关闭所有的流(_fcloseall) 使用时注意: (1)fclose函数返回值为0 时表示文件成功关闭,否则返回值为非0。 (2)fcloseall成功关闭所打开的文件时,函数返回值为关闭文件的总数。 (3)fclose函数的参数为指向FILE结构体的指针。30例11. 3 打开一个名为 FREAD.OUT 的文件并写入25 个字符, 然后将从文件中读出的字符#include void main() FILE *stream; char list30; int i, numread, numwritten; / 文本模式打开文件并写

20、数据 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( Wrote %d itemsn, numwritten ); fclose( stream ); else printf( Problem opening the filen ); /*读出25个字符*/ if( (stream = fopen( fread.out, r+

21、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( not be openedn );输出:Wrote 25 itemsNumber of items read = 25Contents of buffer = zyxwvutsrqponmlkjihgfedcb3111.

22、4.2文件输入输出流在C +中,对文件的输入输出操作提供了另一种操作方式,即流类库的文件操作,这些类是ofstream与ifstream文件输入输出流类。其对文件操作也需要上述的三个步骤。1. 文件的输出 文件的输出由ofstream完成,它由ostream类继承而来(见图11.2),并继承了它的操作,因此可以利用ostream重载的操作符函数和文件打开,从文件中读数据、关闭文件的函数。ifstream也提供了构造函数:ifstream();ifstream(const cahr_FAR *,int=ios:in,int=);371).文件的打开 第一个构造函数用于构造一个不带参数的流,如果需

23、要可以在用它的open函数打开一个文件,下面是open函数的定义: void open(const signed char_FAR *,int=ios:in,int=);它和第二构造函数的使用同文件的输入中的文件打开。 2). 文件的数据读出函数 可以使用istream类的写数据的函数和操作符把数据写入文件,操作符函数在前面已经介绍,这里实现写数据的函数是:class _CRTIMP istream : virtual public ios public: /读取文件数据到字符串内 inline istream& get(char *,int,char =n); inline istream&

24、 get(unsigned char *,int,char =n); inline istream& get(signed char *,int,char =n); /读取文件数据到字符内 istream& get(char &); inline istream& get(unsigned char &); inline istream& get( signed char &);istream& get(streambuf&,char =n); /读取文件一行数据到字符串内 inline istream& getline(char *,int,char =n); inline istream&

25、 getline(unsigned char *,int,char =n); inline istream& getline(signed char *,int,char =n); inline istream& ignore(int =1,int =EOF); /读取文件数据到字符串内 istream& read(char *,int); inline istream& read(unsigned char *,int); inline istream& read(signed char *,int); int gcount() const return x_gcount; int peek

26、(); istream& putback(char); int sync(); /移动输入文件指针位置 istream& seekg(streampos);istream& seekg(streamoff,ios:seek_dir);/读取当前输入文件指针位置的值streampos tellg(); 383). 文件的关闭函数ifstream类也是从fstreambase类继承的,可以使用fstreambase类的close();来关闭文件。39例11. 4使用istream和ostream类的文件操作函数把一个文件的内容拷贝到另一个文件。#include #include #include void main() char ch;ifstream fin(“”); /创建一个输入流,并和输入文件联系ofstream fout(“”);/创建一输出流,并和输出文件联系if(!fin) cerr”Cannot open ”;exit(-1); /如果原文件出错,显示信息并退出 if (!fout)cerr”Cant open ”;exi

温馨提示

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

评论

0/150

提交评论