Как сохранить map в файл
Я хочу написать std :: map в файл и прочитать его обратно. Я ищу довольно простой и минималистский способ сделать это, без повышения. Я обнаружил, что это выполнимо с вектором, как здесь Чтение и запись std :: vector в файл правильно с помощью итераторов
Я нашел этот вопрос, поскольку он связан с тем, что я хочу сделать, за исключением того, что я ищу бинарную альтернативу.
Решение
Для типов без динамической памяти (фактически, с указателями)
Для типов с задействованной динамической памятью (указателями) решение будет полностью зависеть от того, как они работают, волшебное решение не может быть предоставлено.
Рассматривали ли вы JSON ?
Другие решения
Это давняя проблема: как записать скромно сложную структуру данных в некоторый текстовый или двоичный формат, а затем иметь возможность позже прочитать ее обратно. Есть несколько разных способов сделать это. Однако вы сказали, что хотите сериализовать в двоичный формат, поэтому я бы порекомендовал использовать MessagePack .
Есть библиотека C ++ 11 для работы с форматом MessagePack, которая называется msgpack11 это также довольно легкий вес, который, кажется, соответствует вашим требованиям. Вот пример:
Для бинарной записи вы должны использовать метод записи ostream
Вы не можете записать карту в файл оперативно, вы должны написать ее репрезентацию, разработанную вами. Вам нужно будет записать каждую пару ключ / значение по отдельности или буферизовать их как блок данных и записать их в файл. Однако на самом деле это не намного сложнее, чем цикл for. Если карта содержит классы, которые тривиально не создаются и не уничтожаются, вы должны реализовать метод, позволяющий сериализовать двоичные данные класса.
Это быстро написано. Это можно улучшить с помощью шаблонов, чтобы охватить все основные типы и все контейнеры STL.
Также было бы неплохо иметь в виду про endian.
В этом случае лучше избегать использования перегруженных операторов. Но если вы, если делать это, то лучше всего определить класс, который будет оборачивать поток STL и будет иметь собственный набор перегруженных >> << операторы. Посмотрите на Qt QDataStream ,
Читайте также: