可以通过使用ios :: binary
将以下Student类转换为二进制文件#include <fstream>
#include <iostream>
using namespace std;
class Student{
public:
char name[40], address[120], gender;
double age;
bool is_blabla;
};
int main() {
Student one;
strcpy(one.name, "Cancan Can");
strcpy(one.address, "example example exampla");
one.gender = 'M';
one.age = 25;
one.is_blabla = true;
ofstream ofs("fifthgrade.ros", ios::binary);
ofs.write((char *)&one, sizeof(one));
Student two;
ifstream ifs("fifthgrade.ros", ios::binary);
ifs.read((char *)&two, sizeof(two));
// check if the data is OK
cout << "Student Name: " << two.name << endl;
return 0;
}
该文件如下所示:
http://i.imgur.com/GfkheWs.png
那么在这种情况下如何将类转换为字节(或说char *)数组呢?
编辑:但在这种情况下,我们说我有一个有方法的课程。你给出的答案告诉我编写自己的按位运算符来序列化一个复杂的类。你能参考一个很好的资料来教导它是如何完成的,还是一个小样本/例子呢?
Edit2:我必须避免使用额外的库,因为我可能会在机器/编译器上反序列化我无法导入大多数库的序列化代码(例如,我将尝试对nvcc编译代码上的代码进行反序列化)。 / p>
虚拟类的示例如下:
class Student{
public:
char name[40], address[120], gender;
double age;
bool is_blabla;
void set_values (int,int);
int doubleage() {return age*2;}
};
答案 0 :(得分:4)
只需使用std::stringstream
而不是std::ofstream
。
然后,使用char*
访问std::stringstream::str()
(此返回为std::string
,您可以使用char*
检索std::string::c_str()
。
答案 1 :(得分:1)
可以将所有对象作为其组成char
进行访问,只需获取指针并进行投射。
尽管如此,即使您想将其写入二进制文件(与编写文本表示形式相反),也不要只写下其原始字节:
BTW:ios::binary
只是禁用文本文件的翻译。 (关于Unixoids的身份,Windows上的换行符转换......)
答案 2 :(得分:1)
如果您需要更强化的方法,请考虑以下方法: