C++文件的I/O操作
一、文件处理的基本概念
1、打开和关闭文件:对文件操作前需要准备相应的缓冲区,缓冲区管理变量和文件指针等,还需将文件和一个特定的变量联系起来,这称为打开文件。若程序不再使用某文件,应即时释放占用的缓冲区等资源,这称为关闭文件。
2、读文件:从文件中将数据复制到内存变量中。
3、写文件:将内存变量中的数据复制到文件中。
4、文件指针:由于文件的数据很多,所以在在读写时应指明对哪些数据进行操作。在流式文件中采用的方法是设立一个存放文件读写位置的变量,称为文件指针。
5、缓冲区:在内存中开辟的一片存储单元。
二、文件操作流程:首先要对头文件进行包含:#include<fstream.h>
1、文件的打开,先定义数据流对象,然后将该对象与数据文件联系起来。
2、文件的输入输出操作。
3、数据流的关闭(文件的关闭)。
三、文件的打开与关闭
1、定义文件流对象:如ifstream fin;
2、将文件流对象与文件关联:对象名.open(文件名,文件打开模式,文件的保护方式)
文件的打开模式
模式 |
功能 |
ios::app |
打开文件,在文件尾部添加数据 |
ios:ate |
打开文件时将文件指针定位于文件尾部 |
ios:in |
打开文件进行读操作 |
ios:out |
打开文件进行写操作 |
ios:nocreate |
若文件不存在,在打开操作失败 |
ios::noreplace |
若文件存在,除非设置ios::ate或ios::app,否则打开失败 |
ios::trunk |
若文件存在,将其长度截为0并清除原有内容 |
ios::binary |
以二进制形式打开文件,默认为文本文件 |
文件的保护方式,通常使用默认值
方式 |
功能 |
filebuf::openprot |
兼容共享方式 |
filebuf::sh_read |
允许读共享 |
filebuf::sh_write |
允许写共享 |
filebuf::sh_none |
独占方式 |
文件流的状态
成员函数 |
功能 |
is_open() |
流对象是否与文件关联 |
good() |
刚进行的操作成功了返回true |
fail() |
刚进行的操作失败返了回true |
bad() |
若进行了非法操作返回true |
eof() |
操作时,位置指针到达文件尾返回true |
3、关闭文件流:文件流对象名.close();
四、文件的顺序读写操作
1 /********************************** 2 *将abc.txt的内容复制到123.txt中 3 **********************************/ 4 #include <IOSTREAM> 5 #include <FSTREAM> 6 using namespace std; 7 void main() 8 { 9 /********************************* 10 *打开文件进行读操作 11 *********************************/ 12 fstream in("d:\\test\\abc.txt",ios::in); 13 if (in.fail()) 14 { 15 cout<<"can not open this file !"<<endl; 16 abort(); 17 } 18 /********************************** 19 *打开文件进行写操作 20 ***********************************/ 21 fstream out("d:\\test\\123.txt",ios::out|ios::app); 22 if (out.fail()) 23 { 24 cout<<"can not open this file !"<<endl; 25 abort(); 26 } 27 28 char s; 29 while (!in.eof()) 30 { 31 in.get(s); 32 cout<<s; 33 out.put(s); 34 } 35 in.close(); 36 out.close(); 37 }
五、文件流的定位与文件的随机读写
1、和输入流中的指针有关的操作:
istream &istream::seekg(流中位置);
istream &istream::seekg(偏移量,参照位置);
streampos istream::tellg() ;
流中位置、偏移量和streampos都是长整型量,并且以字节为单位;第一个将指针定位到绝对位置,第二个定位到相对位置,第三个返回一个长整型的值,用来表示当前指针的位置距离流开始位置的字节数。
2、参照位置的表示
beg:相对于流开始的位置。
cur:相对于当前位置指针指定的位置。
end:相对于流的结尾位置。
例子,移动指针的操作:
in.seekg(100,ios::beg); 将指针从流开始位置向末尾方向移动100个字节。
in.seekg(-100,ios::cur); 将指针从当前位置向开始方向移动100个字节。
in.seekg(-100,ios::end); 将指针从结尾位置向开始方向移动100个字节。
使用seekg函数将指针移动后,下次的读操作从移动后的位置开始。
3、和输出流中的指针有关的操作:
ostream &ostream::seekp(流中位置);
ostream &ostream::seekp(偏移量,参照位置);
otreampos ostream::tellp() ;