我正在尝试从chokkan实现 cdbpp库。当我尝试为数据类型为strings
的值实现相同时,我遇到了一些问题。
原始代码和文档可在此处找到: http://www.chokkan.org/software/cdbpp/和git源代码在这里:https://github.com/chokkan/cdbpp
这是我到目前为止所做的:
在sample.cpp中(从我调用main函数的地方),我修改了build()
函数:
bool build()
{
// Open a database file for writing (with binary mode).
std::ofstream ofs(DBNAME, std::ios_base::binary);
if (ofs.fail()) {
std::cerr << "ERROR: Failed to open a database file." << std::endl;
return false;
}
try {
// Create an instance of CDB++ writer.
cdbpp::builder dbw(ofs);
// Insert key/value pairs to the CDB++ writer.
for (int i = 1;i < N;++i) {
std::string key = int2str(i);
const char* val = "foobar"; //string value here
dbw.put(key.c_str(), key.length(), &val, sizeof(i));
}
} catch (const cdbpp::builder_exception& e) {
// Abort if something went wrong...
std::cerr << "ERROR: " << e.what() << std::endl;
return false;
}
return true;
}
在cdbpp.h文件中,我将put()
函数修改为:
void put(const key_t *key, size_t ksize, const value_t *value, size_t vsize)
{
// Write out the current record.
std::string temp2 = *value;
const char* temp = temp2.c_str();
write_uint32((uint32_t)ksize);
m_os.write(reinterpret_cast<const char *>(key), ksize);
write_uint32((uint32_t)vsize);
m_os.write(reinterpret_cast<const char *>(temp), vsize);
// Compute the hash value and choose a hash table.
uint32_t hv = hash_function()(static_cast<const void *>(key), ksize);
hashtable& ht = m_ht[hv % NUM_TABLES];
// Store the hash value and offset to the hash table.
ht.push_back(bucket(hv, m_cur));
// Increment the current position.
m_cur += sizeof(uint32_t) + ksize + sizeof(uint32_t) + vsize;
}
现在,如果字符串小于或等于3个字符,我得到正确的值(例如:foo将返回foo)。如果它大于3它给我正确的字符串最多3个字符然后垃圾值(例如foobar给我foo `)
我对c ++有点新意,我很感激你能给我的任何帮助。
答案 0 :(得分:1)
(将评论中的可能答案移到真实答案中)
传递给put的vsize是一个整数的大小,它应该是值字符串的长度。