C++ 文件流的一些操作
对于C++的文件操作,本人没搞太明白。现在只是将某些操作与需要注意的地方介绍给大家。基于流的操作:
1.文件流 write 成员函数
将一个类对象的二进制表示记录到数据文件中:
#include <iostream>
#include <fstream>
#include <Date.h> // 这个是一个时间类
using namespace std;
int main()
{
Date dat(6, 24, 1940);
struct date{
int mo, da, yr;
}dt;
dat.GetDate(dt.mo, dt.da, dt.yr);
ofstream of("data.dat", ios::binary);
if(!of.fail()){ //打开文件成功
of.write(reinterpret_cast<char*> (&dt), sizeof dt);
}
return 0;
}
解释:程序先用Date类实例化一个Date对象,然后声明一个通用型数据结构,并使用Date::GetDate把Date对象的月、日、年份值装入date结构的数据成员中。接下来进行文件写入。
*这里值得注意的是,为什么要使用一个中间过度的结构体,而不直接将对象写入?
首先,一个类我们可能不知道它的内部设计,可能不知道它如何实现数据表示。
其次,如果类修改后,我们就要重新编译全部程序,并转换所有与以前数据有关的数据文件。
最重要的是,类中可能有一个或多个虚函数,这样的话,它的数据成员中将包含一个隐藏的私用指针(vptr),该指针指向类的虚表(vtbl)。没有任何标准规定,编译器必须把vptr数据成员放在对象存储器的哪个位置上,因此,在程序的移植过程中不能忽视它的存在。我们也不能引用vptr数据成员,甚至不能用成员函数引用它。因此,我们不能保存和恢复它的值。如果我们想从文件中将vptr值读取到另一个程序对象中,可能造成其他程序的指针具有无特殊指向的无用值。这样,当程序为执行一个虚函数二访问vptr,程序就会崩溃。
2.文件流read成员函数
#include <fstream>
#include <Date.h>
int main()
{
struct date{
int mo, da, yr;
}dt;
ifstream fi("date.dat", ios::binary);
if(!fi.fail()){
if.read(reinterpret_cast<char*> (&dt), sizeof dt);
Date dat(dt.mo, dt.da, da.yr);
cout << dat; //对 << 进行了重载
}
return 0;
}
结果会显示: "6/24/1940"。