ofstream:写操作(输出)的文件
ifstream:读操作(输入)的文件
fstream:同时读写操作的文件
被打开的文件在程序中由一个流对象来表示,而对这个流对象所做的任何操作就是对该文件进行操作
open():void open (const char* filename, openmode mode)//通过流打开文件,成员函数
filename:打开的文件名
mode:标志组合
ios::in //输入(读)文件
iOS::out//输出(写)文件
ios::ate//初始位置,文件末尾
iOS::app//所有输出附加在文件末尾
iOS::trunc//如果文件已存在则先删除
ios::binary//二进制方式
fstream中还有一个重载的open函数
void open(const char*filename, int mode, int access);
mode:标志组合
aeecss:打开文件的属性
0:普通文件,打开访问
1:只读文件
2、隐含文件
3、系统文件
标志符可以被组合使用,中间以“|”间隔。
比如当我们以二进制方式打开一个 “aaa.bin” 的文件时,通过调用open函数来实现。
fstream file;
file.open("aaa.bin", ios::out | ios::app | ios::binary);
ofstream ,ifstream和fstream都包含了成员函数open,但是默认的打开方式不同
ofstream ios::out,ios::trunc
ifstream ios::in
fstream ios::in | ios::out
ofstream ifstream和fstream这些类都有一个构造函数可以直接调用open函数。并拥有同样的参数。
ofstream file("aaa,.bin", ios::out | ios::in | ios::binary);//不调用open函数的打开方式
可以通过调用is_opne函数来检查文件是否被打开
bool is_open();
完成读写操作后,我们将必须关闭文件,使得这个文件可以重新被访问。
void close();
对文件调用close()函数后,原先的流对象就可以用来打开其他文件,这个文件也可以被其他进程来访问。
为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close.
file.eof() //当文件到达末尾的时候返回true
file.bad() //如果在读写过程中出错,返回true
file.fail()//读写过程中出错and格式错误返回true
file.good()//如果调用以上任何一个函数返回true的话,此函数则返回false
clear() //重置以上成员函数所检查的标志
所有输入/输出流对象都至少有一个流指针:
ifstream:有一个get pointer的指针,指向下一个将被读取的元素
ofstream:有一个put pointer的指针,指向写入的下一个元素
fstream:同时继承get和put
通过下面的成员函数来读出或者配置这些流指针
tellg()和tellp()
//这两个成员函数不用传入参数,返回pos_type类型的值,就是一个整数,代表get和put流指针的位置
seekg()和seekp()
//用来改变流指针get和put的位置
seekg(off_type pos);
seekp(off_type pos);
//使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置,要求传入的参数类型与函数tellg和tellp的返回值相同
seekg(off_type offset, seekdir dir);
seekp(off_type offset, seekdir dir);
//使用这个原型可以指定由参数dir决定的一个具体的指针开始计算的一个位移(offset)
iso::beg 从流开始位置计算的位移。
ios::cur 从流指针当前位置开始计算的位移
ios::end 从流末尾处开始计算的位移
流指针get和put的值对文本文件和二进制文件的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改,因此建议对文件模式打开的文件总是使用seekg和seekp的第一种原型,而且不要对tellg和ellp的返回值进行修改。
对二进制文件,可以任意使用这个函数,因为不会有任何意外发生。
流文件包括两个为顺序读写数据特殊设计的成员函数:write和read
write:是ostream的一个成员函数
write(char * buffer, streamsize size);
read:是istream的一个成员函数
read(char* buffer, streamsize size);
// reading binary file
#include
#include
using namespace std;
int main ()
{
const char * filename = "example.txt";
char * buffer;
long size;
ifstream file(filename, ios::in|ios::binary|ios::ate);
size = file.tellg();//初始位置为文件尾部
file.seekg(0, ios::beg);
buffer = new char [size];
file.read(buffer, size);
file.close();
cout <<"the complete file is in a buffer";
delete[] buffer;
return 0;
}
//The complete file is in a buffer
当我们对文件流进行操作的时候,他们与一个streambuf类型的缓存(buffer)联系到一起,这个buffer实际上是一块内存空间,所谓流(stream)和物理文件的媒介。对一个输出流,每次成员函数put被调用,这个字符不是直接写入该输出流所对应的物理文件中的,而是首先被插入到buffer中的。
当缓存被flush时,它里面的所有数据会被写入到物理媒介中(输出流),或者简单的被抹掉(输入流),这个过程被称为时同步(synchronization)