,二进制文件的读写
求助,二进制文件的读写.
有一个类,例如:
......
class Student
{
public:
void SetName();//置名字
void SetCalss();//置班级
protected:
char Name[20];
int class;
}
......
置了名字和班级后欲将数据保存到二进制文件里,则:
......
Student Stu;
fstream iof;
iof.seekg(0,ios::end);
iof.write((char*)&Stu,sizeof(Student));//这样写会不会有误?
......
有没有更好的解决办法?
------解决方案--------------------
对于这个特定的结构,可以这样写,但最好不要这么写。理由如下:
1、有可能面临32位系统字节对齐的问题(还可能得考虑64位对齐问题),如果Name不是20个字节,而是21个字节,就会遇到这个问题。
2、修改问题,如果后来修改了这个类的定义,如添加了一个虚函数什么的,则前四个字节就是this指针了。
------解决方案--------------------
一般说,每一个类都需要实现一些数据存储的支持函数,我的方法是
1、Load:清空当前数据,读入自定义的特定格式的数据;
2、Save: 保存当前自定义的特定格式的数据;
3、Import: 不清空当前数据,导入外来的XML格式的数据,检查格式,处理数据冲突;
4、Export:导出XML格式的数据;
5、重载> > 、 < <操作符,用Load、Save实现.
有一个类,例如:
......
class Student
{
public:
void SetName();//置名字
void SetCalss();//置班级
protected:
char Name[20];
int class;
}
......
置了名字和班级后欲将数据保存到二进制文件里,则:
......
Student Stu;
fstream iof;
iof.seekg(0,ios::end);
iof.write((char*)&Stu,sizeof(Student));//这样写会不会有误?
......
有没有更好的解决办法?
------解决方案--------------------
对于这个特定的结构,可以这样写,但最好不要这么写。理由如下:
1、有可能面临32位系统字节对齐的问题(还可能得考虑64位对齐问题),如果Name不是20个字节,而是21个字节,就会遇到这个问题。
2、修改问题,如果后来修改了这个类的定义,如添加了一个虚函数什么的,则前四个字节就是this指针了。
------解决方案--------------------
一般说,每一个类都需要实现一些数据存储的支持函数,我的方法是
1、Load:清空当前数据,读入自定义的特定格式的数据;
2、Save: 保存当前自定义的特定格式的数据;
3、Import: 不清空当前数据,导入外来的XML格式的数据,检查格式,处理数据冲突;
4、Export:导出XML格式的数据;
5、重载> > 、 < <操作符,用Load、Save实现.