1、第8章 I/O系统和文件,流 格式化I/O 文件流,流,流的概念 预定义的C+流 重载I/O运算符,流,流是一种生成或使用信息的抽象。C+的I/O系统把流连接到物理设备上,它的一个重要特点是不论它所连接的设备是什么,都采用相同的方式进行操作。 流有两种基本形式:文本流和二进制流。 文本流用于传递字符 二进制流用于传递所有数据类型的数据。 对流可以进行的最基本的操作是:打开和关闭。打开流可以让流连接到文件,而关闭操作可以让流断开与文件的连接,预定义的C+流,cin 标准输入流 cout 标准输出流 cerr 连接到标准输出的流,用于写入调试和错误信息 采用非缓冲的方式 clog 连接到标准输出的
2、流,用于写入调试和错误信息 以缓冲的形式工作,重载I/O运算符,由于“”的作用是向流中插入,“(istream stream, 类名 ,创建一个插入函数,定义一个是友元函数的插入函数,定义提取函数,格式化I/O,使用ios成员函数进行格式化输入输出 使用操控符实现格式化输入输出,使用ios成员函数进行格式化输入输出,所有的流都有一套与它相关的格式标识,这些标识用于格式化流中的数据。 类ios就定义了一个fmtflags数据成员,这个数据成员以枚举的方式定义了很多的常量来表示输出的格式。,fmtflags掩码枚举中定义的格式标识,ios中定义的常用成员函数,简单使用ios进行格式化输出,取消与测
3、试输出格式的设置,使用width, precision和fill进行格式设置,使用操控符实现格式化输入输出,操控符就是一系列的函数,这些函数可以包含在I/O表达式中更改流的格式参数,使用操控符,用户自定义操控符,与C+预定义的操控符一样,可以定义输入用的操控符,也可以定义输出用的操控符。 定义输出操控符的方法如下: ostream ,建立一个输出操控符set和一个输入操控符prompt,文件流,打开和关闭文件 读写文本文件 读写二进制文件 其他I/O函数,文 件 流,为了不同的目的,可以使用3种流:文件输入流、文件输出流和文件输入/输出流。 它们分别由类ifstream, 类ofstream和
4、fstream定义,打开文件,在定义了流之后,就可以在流上执行open操作来实现文件的打开。 每种流都有这个成员函数,惟一的区别是参数的取值不同。 第一个参数是一个指向字符的指针,用于传入表示文件名的字符串; 第二个参数指定文件的打开模式,不同流的open成员函数的这一项取值互不相同。 open函数原型如下: void ifstream:open(const char *filename, ios:openmode); void ofstream:open(const char *filename, ios:openmode); void fstream:open(const char *fi
5、lename, ios:openmode);,文件打开模式的取值,关闭文件,在打开文件并对文件进行了相关的操作之后,必须对控制流执行关闭操作,就是执行相关流的close成员函数。 close成员函数没有参数,也没有返回值。,读写文本文件,使用“”运算符,读写文本文件的例子,读写二进制文件,为了能够存储文本文件不能够存储的非格式化信息,就需要使用二进制文件。 创建二进制文件的方法 以ios:binary模式创建文件,并采用这种方法对文件进行读取。 二进制文件不可以使用“”和“”进行输入输出,为了实现输入输出可以使用下面的两种方法:一是使用成员函数put和get;二是使用成员函数read和writ
6、e。,put和get,使用put和get可以实现对流中单个字符的输入和输出。 get函数和put函数的函数原型是: istream 其中 get函数从istream中读取一个字符放置在ch中,并返回对流的引用。如果到达流的末尾,就会返回一个false; 而put()函数将ch中保存的字符放到ostream流中,并返回对流的引用,编写一个程序读取任何文件的内容,使用put()函数将字符串写入文件,read和write,使用get和put只能对文件读入和输出单个字符,而使用read和write则可以读入和输出一块字符。read和write也是流类的成员函数。 原型 istream 其中:read的
7、作用是从相关流中读取num所指定的字节数的数据,并将它们放到buf所指定的缓冲区中;wirte的作用是从buf所指定的缓冲区中将num个字节的数据输出到相关流中;streamsize是使用typedef定义的整数类型。,使用wirte成员函数向文件中写入数据,使用read成员函数读取文件中的数据,重载的get函数,最常用的几个重载函数原型如下: istream 第一种形式的get函数的作用是读取num-1个字符到buf所指定的缓冲区中。 第二种形式的get函数的作用是读取num-1个字符到buf所指定的缓冲区中。 第三种形式的get函数的作用是从流中读取一个字符,把它作为返回值。如果到达文件尾
8、就返回一个文件结束标识EOF。,使用重载的get()函数,getline函数,istream 第一种形式的getline函数的作用是读取num-1个字符到buf所指定的缓冲区中。 第二种形式的getline函数的作用是读取num-1个字符到buf所指定的缓冲区中。,eof函数,eof函数专门用于检测是否已经到达文件尾 原型 bool eof(); 如果没有到达文件末尾,则返回false,否则返回true。,peek和putback函数,peek的作用是从流中获取下一个字符,但是不提取出来。如果下一个字符是文件结束标识EOF,那么会返回这个标识。 原型: int peek(); putback则
9、可以把已经提取出的字符再放回到流中。这个函数带一个char类型的参数,用于把这个字符放到指定的流中。 原型 istream ,flush函数,C+允许调用flush函数将没有写满的缓冲区内容写到物理设备上 原型 ostream ,随机存取,为了实现随机存取,C+中为一个文件定义了两个指针 一个是获取指针,它指示下一次在文件的哪一个位置上发生输入操作; 一个是放置指针,它指示下一次在文件的哪一个位置上发生输出操作。,seekg和seekp,函数seekg和seekp可以操作两个指针来实现随机存取。 seekg函数的作用是将文件当前的获取指针从指定的某一点开始移动某个偏移量字节数; seekp函数
10、的作用是将文件的放置指针从指定的某一个点开始移动某个偏移量字节数。 原型: istream 其中:off_type是ios用typedef定义的一种整数类型;而seekdir则是一个枚举类型,seekdir类型的取值,实现随机向文件写入,从任意位置开始显示文件内容,rdstate函数,原型: iostate rdstate(); iostate是用于定义当前状态的枚举,4个函数,bool bad(); bool eof(); bool fail(); bool good(); 如果操作正确,那么函数good的返回值是true,否则为false; 如果发生了致命的错误,那么函数bad的返回值是true,否则为false; 如果发生了非致命的错误,那么函数fail的返回值是true,否则为false; 如果到达了文件尾,那么函数eof()的返回值是true,否则为false。,clear函数,如果出现了错误,但是这个错误并不影响程序的继续执行,那么就需要清除错误标识。 原型: void clear(iostate flags); 如果flags的值是ios:goodbit,那么将清除所有的错误标识;如果是其他的设置,那么会清除相应的错误标识。,