头文件 < fstream>
c++中有一个stream,所有的I/O都是以这个流类为基础的。继承结构如下图:
a.”<<”插入器,向流输出数据;
b.”>>”析取器,向流输出数据;
我们主要讨论ifstream和ofstream
ifstream 和ofsteam 包含在头文件fstream中。
ofstream 是从内存读到硬盘;
ifstream 是从硬盘读到内存。
fstream 是可对打开的文件进行读写操作。
在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作。
函数:open()
void open ( const char * filename,ios_base::openmode mode = ios_base::in | ios_base::out );
void open(const wchar_t *_Filename, ios_base::openmode mode= ios_base::in | ios_base::out,int prot = ios_base::_Openprot);
参数: filename 待操作的文件名
mode 打开文件的方式
prot 打开文件的属性
打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:
可以用“或”把以上属性连接起来,如ios::out|ios::binary
Demo
fstream file1;
file1.open("c:\\config.sys",ios::binary|ios::in,0);
file1.open("c:\\config.sys"); <=> file1.open("c:\\config.sys",ios::in|ios::out,0);
fstream file1("c:\\config.sys");
ifstream file2("c:\\pdos.def");//以输入方式打开文件
ofstream file3("c:\\x.123");//以输出方式打开文件
所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定
file.close()
打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:file1.close();就把file1相连的文件关闭。
类ofstream, ifstream 和fstream 是分别从ostream, istream 和iostream 中引申而来的。这就是为什么 fstream 的对象可以使用其父类的成员来访问数据。
一般来说,我们将使用这
些类与同控制台(console)交互同样的成员函数(cin 和 cout)来进行输入输出。如下面的例题所示,我们使用重载的插入操作符<<:
DEMO
ofstream out("out.txt");
if(out.is_open())
{
out<<"HELLO WORLD!"<;
out.close();
}
`
结果在文件out.txt中写入了HELLO WORLD!
`
ifstream in("out.txt");
cha buffer[200];
if(in.is_open())
{
while(!in.eof())
{
in.getline(buffer,100)
cout<;
out.close();
}
}
结果在屏幕上输出了 :HELLO WORLD!
`
状态标志符的验证(Verification of state flags)
这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。
// reading binary file
#include
#include
const char * filename = "test.txt";
int main () {
char * buffer;
long size;
ifstream in (filename, ios::in|ios::binary|ios::ate);
size = in.tellg();
in.seekg (0, ios::beg);
buffer = new char [size];
in.read (buffer, size);
in.close();
cout << "the complete file is in a buffer";
delete[] buffer;
return 0;
}
//运行结果:
The complete file is in a buffer `
和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。相应的函数:
seekp()
ostream &seekp(streamoff offset,seek_dir origin); //设置写位置
定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举:
ios::beg: 文件开头
当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起。这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介。例如,对于一个输出流, 每次成员函数put (写一个单个字符)被调用,这个字符不是直接被写入该输出流所对应的物理文件中的,而是首先被插入到该流的缓存(buffer)中。
当缓存被排放出来(flush)时,它里面的所有数据或者被写入物理媒质中(如果是一个输出流的话),或者简单的被抹掉(如果是一个输入流的话)。这个过程称为同步(synchronization),它会在以下任一情况下发生: