Как сохранить объект с вектором или другой контейнер стандартной библиотеки в двоичный файл в C ++? - PullRequest
0 голосов
/ 16 октября 2019

объект, подобный этому:

#include <vector>
using namespace std;
class A
{
public:
    vector<int> i;
    //save other variable
};

void save(const A & a)
{
    //dosomething
}

int main()
{
    A a;
    save(a);
    return 0;
}

как сохранить его в двоичный файл? другими словами, как написать функцию сохранения?

Ответы [ 2 ]

5 голосов
/ 16 октября 2019

ofstream и copy должно быть достаточно:

void save(const A & a)
{
    std::ofstream out_file("path/to/output/file", std::ios::binary);
    std::copy(a.i.begin(), a.i.end(), std::ostream_iterator<int>(out_file));
}

Кстати, вам, вероятно, следует избегать using namespace std;.

Как указано в комментариях (спасибо @Daniel Langr), это будетработать только для типов с рабочей реализацией operator<< для ofstream или ее базовых классов

0 голосов
/ 16 октября 2019

Существуют библиотеки, которые могут помочь вам с сохранением в файлах, но вы можете сделать это и сами.

Если вам нужны данные в двоичном формате в файле, тогда вы можете использовать ostream :: write () функция и для сохранения контейнера, по крайней мере размер должен быть сохранен.

Таким образом, очень специфическая функция будет

void save(const A & a)
{
    std::ofstream out_file("path/to/output/file", std::ios::binary);
    size_t sz = a.i.size();
    out_file.write(reinterpret_cast<const char*>(&sz), sizeof(size_t));
    for (const auto& i: a.i) out_file.write(reinterpret_cast<const char*>(&i), sizeof(int));
}

Было бы лучшепередать поток функции и заставить функцию сохранения класса вызвать функцию сохранения контейнера, которая по очереди сохраняет каждую запись следующим образом:

void save(std::ofstream& out, int i)
{
    out.write(reinterpret_cast<const char*>(&i), sizeof(int));
}

template<typename E> void save(std::ofstream& out, const std::vector<E>& v)
{
    size_t sz = v.size();
    out.write(reinterpret_cast<const char*>(&sz), sizeof(size_t));
    for (const auto& i: v) save(out, i);
}

void save(std::ofstream& out, const A & a)
{
    save(out, a.i);
}

Таким образом, контейнеры с записями любого типа могут сохраняться до тех пор, покаесть функция сохранения.

...