我试图将迭代应用到我的leveldb文件,但不幸的是我无法得到结果。我遇到的问题是使用迭代器指针时的分段错误。我使用了gdb而且我知道问题在于
leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
(我在此文件的某些值之前添加了/ tem / userDb,并且添加工作正常。)
#include <assert.h>
#include <leveldb/db.h>
#include <iostream>
#include <sstream>
using namespace std;
void iteration(leveldb::DB* db)
{
leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
for (it->SeekToFirst(); it->Valid(); it->Next())
{
cout << "key :" << it->key().ToString() << " : "
<< "value:" << it - > value().ToString() << endl;
}
if (false == it->status().ok())
{
cerr << "An error was found during the scan" << endl;
cerr << it->status().ToString() << endl;
}
delete it;
}
int main(int argc, char *argv[])
{
leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true;
// erase error if the database exists
options.error_if_exists = true;
leveldb::Status s = leveldb::DB::Open(options, "/tmp/userDb", &db);
if (!s.ok())
cerr << s.ToString() << endl;
iteration(db);
delete db;
}
答案 0 :(得分:0)
不熟悉leveldb
API,但无论db
是s.ok()
还是true
,您都在使用false
。我假设如果s.ok()
为false
,则db
为NULL
,或处于迭代或其他操作无法运行的状态。
您应该将代码更改为:
if (!s.ok()) {
cerr << s.ToString() << endl;
return -1;
}