c++文件操作精细.pdf
c c+文文件件操操作作精精细细(总总 7 7 页页)本页仅作为文档封面,使用时可以删除 This document is for reference only-rar21year.MarchC+通过以下几个类支持文件的输入输出:ofstream:写操作(输出)的文件类(由 ostream 引申而来)ifstream:读操作(输入)的文件类(由 istream 引申而来)fstream:可同时读写操作的文件类(由 iostream 引申而来)打开文件(Open a file)对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(streamobject)来表示(这些类的一个实例),而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。要通过一个流对象打开一个文件,我们使用它的成员函数 open():voidopen(const char*filename,openmode mode);这里 filename 是一个字符串,代表要打开的文件名,mode 是以下标志符的一个组合:ios:in 为输入(读)而打开文件ios:out 为输出(写)而打开文件ios:ate 初始位置:文件尾ios:app 所有输出附加在文件末尾ios:trunc 如果文件已存在则先删除该文件ios:binary 二进制方式这些标识符可以被组合使用,中间以”或”操作符(|)间隔。例如,如果我们想要以二进制方式打开文件 来写入一些数据,我们可以通过以下方式调用成员函数 open()来实现:ofstream file;(,ios:out|ios:app|ios:binary);ofstream,ifstream 和 fstream 所有这些类的成员函数 open 都包含了一个默认打开文件的方式,这三个类的默认方式各不相同:类 参数的默认方式ofstream ios:out|ios:truncifstream ios:infstream ios:in|ios:out只有当函数被调用时没有声明方式参数的情况下,默认值才会被采用。如果函数被调用时声明了任何参数,默认值将被完全改写,而不会与调用参数组合。由于对类 ofstream,ifstream 和 fstream 的对象所进行的第一个操作通常都是打开文件,这些类都有一个构造函数可以直接调用 open 函数,并拥有同样的参数。这样,我们就可以通过以下方式进行与上面同样的定义对象和打开文件的操作:ofstream file(,ios:out|ios:app|ios:binary);两种打开文件的方式都是正确的。你可以通过调用成员函数 is_open()来检查一个文件是否已经被顺利的打开了:bool is_open();它返回一个布尔(bool)值,为真(true)代表文件已经被顺利打开,假(false)则相反。关闭文件(Closing a file)当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。关闭文件需要调用成员函数 close(),它负责将缓存中的数据排放出来并关闭文件。它的格式很简单:void close();这个函数一旦被调用,原先的流对象(stream object)就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程(process)所有访问了。为防止流对象被销毁时还联系着打开的文件,析构函数(destructor)将会自动调用关闭函数 close。文本文件(Text mode files)类 ofstream,ifstream 和 fstream 是分别从 ostream,istream 和 iostream 中引申而来的。这就是为什么 fstream 的对象可以使用其父类的成员来访问数据。一般来说,我们将使用这些类与同控制台(console)交互同样的成员函数(cin和 cout)来进行输入输出。如下面的例题所示,我们使用重载的插入操作符:n;examplefile This is another line.n;();return 0;fileThis is a line.This is another line.从文件中读入数据也可以用与 cin 的使用同样的方法:This is another line.上面的例子读入一个文本文件的内容,然后将它打印到屏幕上。注意我们使用了一个新的成员函数叫做 eof,它是 ifstream 从类 ios 中继承过来的,当到达文件末尾时返回 true。状态标志符的验证(Verification of state flags)除了 eof()以外,还有一些验证流的状态的成员函数(所有都返回 bool 型返回值):bad()如果在读写过程中出错,返回 true。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。fail()除了与 bad()同样的情况下会返回 true 以外,加上格式错误时也返回true,例如当想要读入一个整数,而获得了一个字母的时候。eof()如果读文件到达文件末尾,返回 true。good()这是最通用的:如果调用以上任何一个函数返回 true 的话,此函数返回false。要想重置以上成员函数所检查的状态标志,你可以使用成员函数 clear(),没有参数。获得和设置流指针(get and put stream pointers)所有输入/输出流对象(i/o streams objects)都有至少一个流指针:ifstream,类似 istream,有一个被称为 get pointer 的指针,指向下一个将被读取的元素。ofstream,类似 ostream,有一个指针 put pointer,指向写入下一个元素的位置。fstream,类似 iostream,同时继承了 get 和 put我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针:tellg()和 tellp()这两个成员函数不用传入参数,返回 pos_type 类型的值(根据 ANSI-C+标准),就是一个整数,代表当前 get 流指针的位置(用 tellg)或 put 流指针的位置(用 tellp).seekg()和 seekp()这对函数分别用来改变流指针 get 和 put 的位置。两个函数都被重载为两种不同的原型:seekg(pos_type position);seekp(pos_type position);使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数类型与函数 tellg 和 tellp 的返回值类型相同。seekg(off_type offset,seekdir direction);seekp(off_type offset,seekdir direction);使用这个原型可以指定由参数 direction 决定的一个具体的指针开始计算的一个位移(offset)。它可以是:ios:beg 从流开始位置计算的位移ios:cur 从流指针当前位置开始计算的位移ios:end 从流末尾处开始计算的位移流指针 get 和 put 的值对文本文件(text file)和二进制文件(binary file)的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改。由于这个原因,建议对以文本文件模式打开的文件总是使用 seekg 和 seekp 的第一种原型,而且不要对 tellg 或 tellp 的返回值进行修改。对二进制文件,你可以任意使用这些函数,应该不会有任何意外的行为产生。以下例子使用这些函数来获得一个二进制文件的大小:n;return 0;size of is 40 bytes.二进制文件(Binary files)在二进制文件中,使用,以及函数(如 getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数(write)是 ostream 的一个成员函数,都是被 ofstream 所继承。而 read 是istream 的一个成员函数,被 ifstream 所继承。类 fstream 的对象同时拥有这两个函数。它们的原型是:write(char*buffer,streamsize size);read(char*buffer,streamsize size);这里 buffer 是一块内存的地址,用来存储或读出数据。参数 size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。/reading binary file#include#include const char*filename=;int main()char*buffer;long size;ifstream file(filename,ios:in|ios:binary|ios:ate);size=();(0,ios:beg);buffer=new char size;(buffer,size);();cout the complete file is in a buffer;delete buffer;return 0;The complete file is in a buffer