Как сохранить map в файл

Обновлено: 01.07.2024

Я хочу написать std :: map в файл и прочитать его обратно. Я ищу довольно простой и минималистский способ сделать это, без повышения. Я обнаружил, что это выполнимо с вектором, как здесь Чтение и запись std :: vector в файл правильно с помощью итераторов

Я нашел этот вопрос, поскольку он связан с тем, что я хочу сделать, за исключением того, что я ищу бинарную альтернативу.

Решение

Для типов без динамической памяти (фактически, с указателями)

Для типов с задействованной динамической памятью (указателями) решение будет полностью зависеть от того, как они работают, волшебное решение не может быть предоставлено.

Рассматривали ли вы JSON ?

Другие решения

Это давняя проблема: как записать скромно сложную структуру данных в некоторый текстовый или двоичный формат, а затем иметь возможность позже прочитать ее обратно. Есть несколько разных способов сделать это. Однако вы сказали, что хотите сериализовать в двоичный формат, поэтому я бы порекомендовал использовать MessagePack .

Есть библиотека C ++ 11 для работы с форматом MessagePack, которая называется msgpack11 это также довольно легкий вес, который, кажется, соответствует вашим требованиям. Вот пример:

Для бинарной записи вы должны использовать метод записи ostream

Вы не можете записать карту в файл оперативно, вы должны написать ее репрезентацию, разработанную вами. Вам нужно будет записать каждую пару ключ / значение по отдельности или буферизовать их как блок данных и записать их в файл. Однако на самом деле это не намного сложнее, чем цикл for. Если карта содержит классы, которые тривиально не создаются и не уничтожаются, вы должны реализовать метод, позволяющий сериализовать двоичные данные класса.

Это быстро написано. Это можно улучшить с помощью шаблонов, чтобы охватить все основные типы и все контейнеры STL.

Также было бы неплохо иметь в виду про endian.

В этом случае лучше избегать использования перегруженных операторов. Но если вы, если делать это, то лучше всего определить класс, который будет оборачивать поток STL и будет иметь собственный набор перегруженных >> << операторы. Посмотрите на Qt QDataStream ,

Читайте также: