将vector <int>保存到文件中

时间:2016-06-07 10:08:39

标签: c++ c++11 serialization save

非常奇怪,我没有在stackoverflow上找到这个问题的答案。

我想将std::vector<int>保存到文件中。 在不同的地方,我发现了以下代码:

std::vector<int> v{0,1,2,4,8,16,32,64,128,256,512};
std::ofstream outfile("test.data", std::ios::out | std::ofstream::binary);
std::copy(v.begin(), v.end(), std::ostreambuf_iterator<char>(outfile));
outfile.close();

但问题是,std::ostreambuf_iterator<char>v的每个值转换为char,然后再将其写入文件。因此,值256512会更改为0。结果文件在hexedit下显示如下:

00000000   00 01 02 04  08 10 20 40  80 00 00

我的想法是将std::ostreambuf_iterator<char>更改为std::ostreambuf_iterator<int>,但这不起作用。编译器抛出错误:

error: no matching function for call to ‘std::ostreambuf_iterator<int>::ostreambuf_iterator(std::ofstream&)’
std::copy(v.begin(), v.end(), std::ostreambuf_iterator<int>(outfile));

如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

您正在寻找std::ostream_iterator,而不是std::ostreambuf_iterator

std::vector<int> v{0,1,2,4,8,16,32,64,128,256,512};
std::ofstream outfile("test.data", std::ios::out | std::ofstream::binary);

std::copy(v.begin(), v.end(), std::ostream_iterator<int>(outfile));
outfile.close();

请注意,结果输出为:

01248163264128256512

这只是将int向量中的值写入输出流,就像使用<<运算符一样,但没有任何分隔符,这可能是您真正想要的,也可能不是。但这就是它的作用。

答案 1 :(得分:1)

您可以序列化为二进制,只需记住字节序等问题就可以了。基本上,使用std :: ofstream和ifstream write()和read()。

序列化和反序列化的两个编程如下所示,快速入侵,因此可能存在错误:

#include <fstream>
#include <stdexcept>
#include <iostream>
#include <vector>

using std::cout;
using std::vector;
using std::ofstream;
using std::ios;

int main()
{
    vector<int> datavec{0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512};

    ofstream outfile;
    outfile.open ("datafile.bin", ios::out | ios::trunc | ios::binary);

    for (auto val : datavec) {
        outfile.write(reinterpret_cast<const char *>(&val), sizeof(int));
        if (outfile.bad()) {
            throw std::runtime_error("Failed to write to outfile!");
        }
    }

    cout << "Wrote data to file. Done.\n";
}
//////////////////////////////////////////////////

#include <fstream>
#include <stdexcept>
#include <iostream>
#include <vector>

using std::cout;
using std::vector;
using std::ifstream;
using std::ios;
using std::ios_base;

int main()
{
    vector<int> datavec;

    ifstream infile;
    infile.open ("datafile.bin", ios::in | ios::binary);

    while (infile) {
        int val;
        infile.read(reinterpret_cast<char *>(&val), sizeof(int));
        if (infile.bad()) {
            throw std::runtime_error("Failed to read from infile!");
        }
        if (infile.eof()) break;
        datavec.push_back(val);
    }

    cout << "Read data file. Contents of datavec: \n";
    for (auto val : datavec) {
        cout << val << ", ";
    }
    cout << "\nDone\n";
}

答案 2 :(得分:0)

或者,在创建流时删除std::ofstream::binary(您也可以删除std::ios::out,因为这是ofstream的默认值。

主要是使用std::ostream_iterator<int>代替std::ostreambuf_iterator<char>

std::vector<int> v{0,1,2,4,8,16,32,64,128,256,512};
std::ofstream outfile("test.data");
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(outfile));
outfile.close();

您可能还想在创建ostream_iterator时添加分隔符。

答案 3 :(得分:0)

如果您希望将整数作为字符写入文件,则可以使用for_each

std::for_each(v.begin(), v.end(), [&outfile](int x){outfile << x;});

这会将整数作为字符串写入文件的一行,它们之间没有空格,即:

  

01248163264128256512