文件流类和文件流对象
文件流是以外存文件为输入输出对象的数据流。
输出文件流 内存->外存
输入文件流 外存->内存
文件流类
流的名称 |
流的作用 |
ifstream类 |
从istream类派生的,用来支持从磁盘文件的输入 |
ofstream类 |
从ostream类派生的,用来支持向磁盘文件的输出 |
fstream类 |
从iostream类派生的,用来支持对磁盘文件的输入输出 |
操作:
打开文件:
1、调用文件流的成员函数open。如
ofstream outfile;
outfile.open("f1.dat",ios::out);
2、在定义文件流对象时指定参数在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能。
ostream outfile("f1.dat",ios::out);
输入输出格式:
ios::in |
以输入方式打开文件 |
ios::out |
以输出方式打开文件(这是默认方式),如果已有此名字的文件,则将其原有内容全部清除 |
ios::app |
以输出方式打开文件,写入的数据添加在文件末尾 |
ios::ate |
打开一个已有的文件,文件指针指向文件末尾 |
ios: :trunc |
打开一个文件,如果文件已存在,则删除其中全部数据,如文件不存在,则建立新文件。如已指定了 ios::out 方式,而未指定ios: :app,ios::ate,ios: :in,则同时默认此方式 |
ios:: binary |
以二进制方式打开一个文件,如不指定此方式则默认为ASCII方式 |
ios::nocreate |
打开一个已有的文件,如文件不存在,则打开失败。nocrcate的意思是不建立新文件 |
ios:: noreplace |
如果文件不存在则建立新文件,如果文件已存在则操作失败,replace 的意思是不更新原有文件 |
ios::in l ios::out |
以输入和输出方式打开文件,文件可读可写 |
ios:: out | ios::binary |
以二进制方式打开一个输出文件 |
ios::in l ios::binar |
以二进制方式打开一个输入文件 |
注意点:
1)每一个打开的文件都有一个文件指针,该指针的初始位置由I/O方式指定,每次读写都从文件指针的当前位置开始。每读入一个字节,指针就后移一个字节。当文件指针移到最后,就会遇到文件结束EOF(文件结束符也占一个字节,其值为-1),此时流对象的成员函数eof的值为非0值(一般设为1),表示文件结束了。
2)可以用“位或”运算符“|”对输入输出方式进行组合但是不能组合互斥的方式
3)如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。可以据此测试打开是否成功。如
if(!outfile.open("f1.bat", ios::app) )
cout<<"open error";
#include
#include
#include
using namespace std;
class Data
{
private:
int m_a;
string m_b;
float m_c;
public:
Data(int a, string b, float c) :m_a(a), m_b(b), m_c(c){}
void show()
{
cout << "m_a:" << m_a << " , m_b:" << m_b << " , m_c:" << m_c << endl;
}
};
int main()
{
/*输出*/
ofstream out("myclass.dat", ios::app | ios::binary);
if (out.is_open()!=true)
{
cout << "can not open myclass.dat " << endl;
exit(1);
}
Data *dataArray[5];
dataArray[0] = new Data(0, "hello0", 0.0);
dataArray[1] = new Data(1, "hello1", 1.0);
dataArray[2] = new Data(2, "hello2", 2.0);
dataArray[3] = new Data(3, "hello3", 3.0);
dataArray[4] = new Data(4, "hello4", 4.0);
out.write((char *)dataArray[0], sizeof(*dataArray[0]));
out.write((char *)dataArray[1], sizeof(*dataArray[0]));
out.write((char *)dataArray[2], sizeof(*dataArray[0]));
out.write((char *)dataArray[3], sizeof(*dataArray[0]));
out.write((char *)dataArray[4], sizeof(*dataArray[0]));
out.close();
system("pause");
}
int main1()
{
/*输入*/
ifstream in("myclass.dat", ios::binary);
if (in.is_open() != true)
{
cout << "can not open" << endl;
exit(0);
}
Data *dataArray[5] ;
dataArray[0] = new Data(0,"",0);
dataArray[1] = new Data(0, "", 0);
dataArray[2] = new Data(0, "", 0);
dataArray[3] = new Data(0, "", 0);
dataArray[4] = new Data(0, "", 0);
in.read((char *)dataArray[0], sizeof(*dataArray[0]));
in.read((char *)dataArray[1], sizeof(*dataArray[0]));
in.read((char *)dataArray[2], sizeof(*dataArray[0]));
in.read((char *)dataArray[3], sizeof(*dataArray[0]));
in.read((char *)dataArray[4], sizeof(*dataArray[0]));
(*dataArray[0]).show();
(*dataArray[1]).show();
(*dataArray[2]).show();
(*dataArray[3]).show();
(*dataArray[4]).show();
in.close();
system("pause");
}