将c ++类转换为字节数组

时间:2014-10-23 11:45:34

标签: c++ arrays class serialization byte

可以通过使用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;}
};

3 个答案:

答案 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)

如果您需要更强化的方法,请考虑以下方法:

  1. Boost.Serialization(http://www.boost.org/doc/libs/1_56_0/libs/serialization/doc/index.html
  2. Google协议缓冲区(https://developers.google.com/protocol-buffers/