Библиотека хранения данных для переполнения стека

Я хотел бы использовать небольшую библиотеку C ++ в своем коде, которая позволила бы сделать что-то вроде:

DataStore ds;
ds.open("data.bin");
int num=5;
std::string str="some text";
ds.put("key1",num);
ds.put("key2",str);
ds.get("key1");// returns int(5)
ds.get("key2");// returns std::string("some text")

Стиль использования не обязательно должен быть таким же, как в этом примере кода, но принцип должен остаться (получить / установить значение любого типа и сохранить его в файловом объекте). Библиотека также не должна быть основана на SQL, и не должна быть оболочкой SQL. Что такое такие библиотеки и каковы их преимущества?

РЕДАКТИРОВАТЬ: максимум 10 тысяч ключей будет использоваться, с ок. 100 байт данных на ключ, файл не должен быть переносимым между компьютерами или ОС, файл не должен редактироваться с помощью текстового редактора (он выглядит более профессионально, если это не так) и не должен быть многопоточным.

3

Решение

Одним из вариантов для вас является использование BerkeleyDB И его C API, C ++ API или же C ++ STL API:

BekeleyDB имеет небольшой размер, быстр, зрел и надежен. Еще одним преимуществом BerkeleyDB является то, что большинство языков сценариев, таких как Python, Perl и т. Д., Имеют привязки к нему, так что вы можете манипулировать (изучать, визуализировать) данными с ними.

Недостатком является то, что все, что вы можете хранить в нем, это пара ключ-значение, где и ключ, и значение являются строками (или, скорее, BLOB-объектами), поэтому вам необходимо преобразовать типы данных C ++ в строки / BLOB-объекты.

5

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

Нетрудно создать класс, который будет выполнять то, что вы описываете, в основном. Все, что вам нужно, — это некоторые функции, которые могут читать / записывать ключи, тег «какой это тип» [возможно, в сочетании с размером хранимых данных, если предположить, что хранимые данные не огромны — и я имею в виду несколько МБ за элемент или около того. Вы можете обнаружить наличие некоторой «структуры индекса» или «где следующий элемент», ссылки на местоположение помогают.

Существует небольшая проблема с тем, как ваш ds.get(std::string) показано: вы не можете вернуть int и std::string из той же функции. Вы можете написать функцию, которая принимает std::string в качестве ссылки, а другой, который принимает int в качестве ссылки, или что-то подобное.

Это становится более интересным, если вам нужно иметь много ключей — на этом этапе вам, вероятно, понадобится какая-то организация типа хэша или двоичного дерева для поиска по ключам. Ключи 10k, вероятно, не имеют большого значения — если вы храните их в отсортированном порядке, это становится проще.

файл не должен быть редактируемым в текстовом редакторе (если это не так, он выглядит более профессионально)

Я должен сказать, я не согласен с этим. Я считаю текстовые редактируемые файлы ОЧЕНЬ профессионально выглядящими. Тот факт, что это двоичный файл, просто делает вещи неуклюжими, и с ним сложнее иметь дело, если что-то в приложении работает не так, как вы хотите (например, он сохранил путь установки, вы переместили его, и он больше не работает, и так как вы не можете запустите его, он не позволит вам редактировать эту конфигурацию).

2