模板化读/写二进制文件

时间:2012-11-04 03:39:09

标签: c++ templates serialization fstream

所以,我一直试图用以下方式自动化二进制文件在C ++中的读写(基本上,因为在处理动态数据时,事情变得具体):

#include <iostream>
#include <fstream>
using namespace std;

template <class Type>
void writeinto (ostream& os, const Type& obj) {
    os.write((char*)obj, sizeof(Type));
}

template <class Type>
void readfrom (istream& is, const Type& obj) {
    is.read((char*)obj, sizeof(Type));
}

int main() {
    int n = 1;
    int x;

    fstream test ("test.~ath", ios::binary | ios::out | ios::trunc);
    writeinto(test, n);
    test.close();

    test.open("test.~ath", ios::binary | ios::in);
    readfrom(test, x);
    test.close();

    cout << x;
}

预期输出为'1';但是,此应用程序在屏幕上显示任何内容之前崩溃。更具体地说,就在写入函数内部时。

我可以解释一下为什么以及如果可能的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您需要获取对象的地址

#include <memory>

os.write(reinterpret_cast<char const *>(std::addressof(obj)), sizeof(Type));
//                                      ^^^^^^^^^^^^^^^^^^^

在紧急情况下,您也可以说&obj,但如果出现重载operator&则不安全。