头文件fstream包含了ifstream、ofstream、fstream三个类,可以通过定义这三个类的对象来实现相对应的文件操作。
#include
ofstream //文件写操作,内存写入存储设备
ifstream //文件读操作,存储设备读取到内存中
fstream //读写操作,对打开的文件可进行读写操作
public member function
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::in | 为输入(读)而打开文件 |
---|---|
ios::out | 为输出(写)而打开文件 |
ios::ate | 初始位置:文件尾 |
ios::app | 所有输出附加在文件末尾 |
ios::trunc | 如果文件已存在先删除文件 |
ios::binary | 二进制方式 |
ofstream outfile;
outfile.open("Hello.txt",ios::in|ios::out|ios::binary)
0 | 普通文件,打开文件 |
---|---|
1 | 只读文件 |
2 | 隐含文件 |
3 | 系统文件 |
对于文件的属性也可以利用“|”和“+”进行组合使用
ofstream out("\\\",ios::out);
ifstream in("\\\",ios::in);
fstream fil("\\\",ios::in|ios::out);
当使用默认的方式对文件进行打开时,可以使用成员函数is_open()对文件进行是否已打开的验证。
文本文件的读写可以如同类与控制台交互一样利用"<<”和">>"分别进行写和读,如:
#include
int main()
{
ofstream file("out.txt");
if(file.is_open())
{
file<<"This is a test"<
#include
#include
using namespace std;
int main()
{
char buff[256];
ifstream infile("in.txt");
if(!infile.is_open())
cout<<"Error open"<
状态标志符的验证
有一些验证流的状态的成员函数(所有都返回bool型返回值):
获得和设置流指针
所有输入/输出流对象都有至少一个流指针:
可以使用以下成员函数来读取或配置流指针:
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 的返回值进行修改。对二进制文件,你可以任意使用这些函数,应该不会有任何意外的行为产生。
// obtaining file size
#include
#include
const char * filename = "test.txt";
int main () {
long l,m;
ifstream in(filename, ios::in|ios::binary);
l = in.tellg();
in.seekg (0, ios::end);
m = in.tellg();
in.close();
cout << "size of " << filename;
cout << " is " << (m-l) << " bytes.\n";
return 0;
} //`获取二进制文件的大小
在二进制文件中,使用<< 和>>,以及函数(如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 = "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