我想在我的代码中使用一些小的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")
使用样式不必与该代码示例相同,但原则应保留(获取/设置任何类型的值并将其存储在文件blob中)。该库也不应该是基于SQL的,也不是SQL包装器。什么是这样的图书馆,它们有什么优势?
编辑:将使用最多10k键,大约。每个密钥100字节数据,文件不需要在计算机或操作系统之间移植,文件不应该使用文本编辑器编辑(如果不是,它看起来更专业)并且不必具有多线程感知。
答案 0 :(得分:5)
您可以选择使用BerkeleyDB及其C API,C++ API或C++ STL API:
BekeleyDB占地面积小,快速,成熟且强大。 BerkeleyDB的另一个优点是大多数脚本语言(如Python,Perl等)都绑定了它,因此您可以使用它们操作(检查,可视化)数据。
缺点是你可以存储的所有内容都是一个键值对,其中键和值都是字符串(或者更确切地说是blob),所以你必须从C ++数据类型转换为字符串/ blob。
答案 1 :(得分:2)
创建一个以基本方式完成所描述内容的类并不难。你需要的只是一些可以读/写键的函数,一个标签“这是什么类型”[可能与存储的数据大小相结合,如果我们假设存储的数据不是很大 - 我的意思是一些MB /项目左右]。您可能会发现某种“索引结构”或“下一个元素在哪里”位置参考帮助。
显示ds.get(std::string)
的方式存在一个小问题:您实际上无法从同一个函数返回int
和std::string
。您可以编写一个以std::string
作为参考的函数,以及另一个以int
作为参考的函数,或者其他一些函数。
如果你需要有很多密钥,它会变得更有趣 - 此时,你可能需要某种哈希或二叉树类型组织来搜索密钥。 10k键可能不是什么大问题 - 如果按排序顺序存储它们会变得更容易。
文件不应该使用文本编辑器进行编辑(如果不是,则看起来更专业)
我必须说,我不同意这一点。我发现文本可编辑文件非常专业。如果应用程序中的某些内容无法按照您的意愿工作(例如,它存储了安装路径,您移动了它,并且它不再有效,并且因为您无法工作,那么它的二进制只会让事情变得尴尬,并且难以处理启动它,它将不允许您编辑该配置。)