将std :: vector <int>保存到文件中

时间:2017-12-04 23:51:51

标签: c++ serialization vector c++03

我注意到,使用时:

std::vector<int> v(100000);
...
std::ofstream outfile("outfile.dat", std::ios::out | std::ofstream::binary);
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(outfile));
outfile.close();

我的std::vector<int>未被序列化为原始字节数据(每int 4个字节)但是作为字符串,即每个整数的字符串表示保存到磁盘,我不想要

如何将std::vector<int>保存为二进制数据?

(注意:在学习新方法之前,我想用标准C ++ 03学习它。)

3 个答案:

答案 0 :(得分:3)

要编写二进制数据,请使用std::ostream::write()代替std::ostream_iterator(内部使用operator<<,因此格式化输出),例如:

std::vector<int> v(100000);
...
std::ofstream outfile("outfile.dat", std::ofstream::binary);
outfile.write(reinterpret_cast<const char*>(v.data() /* or &v[0] pre-C++11 */), sizeof(int) * v.size());
outfile.close();

答案 1 :(得分:2)

std::ostream_iterator使用operator<<将值写入流。元素的编写就像为向量的每个成员使用outfile << value一样,这意味着将值转换为文本。

所以,你要做的是定义一个类,它以二进制表示形式将自身序列化为流,例如:

std::copy(v.begin(), v.end(), std::ostream_iterator<BinaryInt>(outfile));
                                                    ^^^^^^^^^

现在您必须定义BinaryInt类型,以便它可以由int值构建,但可以通过operator<<自行序列化:

struct BinaryInt
{
    int value;
    BinaryValue(int v): value(v) {}
    friend std::ostream& operator<<(std::ostream& str, BinaryInt const& bi)
    {
        // convert bi.value into a binary representation.
        // Note C++ does not define a specific size for int.
        // Nor does it define an endianess.
        // Nor does it define a specific representation.
        // So to be cross platform/OS/compiler you will need to define these
        // and convert the integer into this representation.
        //
        // return str.write(<data>, <size>);
        //
        // If this is just a test the following would work
        // but is extremely brittle for the long term.

        return str.write(reinterpret_cast<const char*>(&bi.value), sizeof(bi.value));
    }
};

答案 2 :(得分:0)

我可以使用Protobufs推荐一种更实用的方法吗?我不会输入代码,但如果您正在处理项目,请不要重新发明轮子。

使用protobuf可以保存&#34;类型&#34;您的数据以及数据,它将帮助您以最小的麻烦扩展您的代码。