|
|
@ -3,11 +3,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
namespace easypr {
|
|
|
|
namespace easypr {
|
|
|
|
|
|
|
|
|
|
|
|
Kv::Kv() { }
|
|
|
|
Kv::Kv() { } //Kv类的构造函数
|
|
|
|
|
|
|
|
|
|
|
|
void Kv::load(const std::string &file) {
|
|
|
|
void Kv::load(const std::string &file) { //一个成员函数,用于从指定的文件中加载键值对
|
|
|
|
this->clear();
|
|
|
|
this->clear();//清空当前的键值对
|
|
|
|
std::ifstream reader(file);
|
|
|
|
std::ifstream reader(file);//打开文件
|
|
|
|
assert(reader);
|
|
|
|
assert(reader);
|
|
|
|
|
|
|
|
|
|
|
|
if (reader.is_open()) {
|
|
|
|
if (reader.is_open()) {
|
|
|
@ -15,17 +15,17 @@ void Kv::load(const std::string &file) {
|
|
|
|
std::string line;
|
|
|
|
std::string line;
|
|
|
|
std::getline(reader, line);
|
|
|
|
std::getline(reader, line);
|
|
|
|
if (line.empty()) continue;
|
|
|
|
if (line.empty()) continue;
|
|
|
|
|
|
|
|
//打开文件并读取每一行
|
|
|
|
const auto parse = [](const std::string &str) {
|
|
|
|
const auto parse = [](const std::string &str) {//解析键和值
|
|
|
|
std::string tmp, key, value;
|
|
|
|
std::string tmp, key, value;
|
|
|
|
for (size_t i = 0, len = str.length(); i < len; ++i) {
|
|
|
|
for (size_t i = 0, len = str.length(); i < len; ++i) {
|
|
|
|
const char ch = str[i];
|
|
|
|
const char ch = str[i];
|
|
|
|
if (ch == ' ') {
|
|
|
|
if (ch == ' ') {//遇到空格时
|
|
|
|
if (i > 0 && str[i - 1] != ' ' && key.empty()) {
|
|
|
|
if (i > 0 && str[i - 1] != ' ' && key.empty()) {
|
|
|
|
key = tmp;
|
|
|
|
key = tmp;
|
|
|
|
tmp.clear();
|
|
|
|
tmp.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}//将之前的字符串作为键,空格后的字符串作为值
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
tmp.push_back(ch);
|
|
|
|
tmp.push_back(ch);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -37,45 +37,45 @@ void Kv::load(const std::string &file) {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
auto kv = parse(line);
|
|
|
|
auto kv = parse(line);
|
|
|
|
this->add(kv.first, kv.second);
|
|
|
|
this->add(kv.first, kv.second);//解析出的键值对添加到存储中
|
|
|
|
}
|
|
|
|
}
|
|
|
|
reader.close();
|
|
|
|
reader.close();//关闭文件
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::string Kv::get(const std::string &key) {
|
|
|
|
std::string Kv::get(const std::string &key) {//是一个成员函数,用于获取给定键的值
|
|
|
|
if (data_.find(key) == data_.end()) {
|
|
|
|
if (data_.find(key) == data_.end()) {
|
|
|
|
std::cerr << "[Kv] cannot find " << key << std::endl;
|
|
|
|
std::cerr << "[Kv] cannot find " << key << std::endl;//如果键不存在,它会打印一个错误消息
|
|
|
|
return "";
|
|
|
|
return "";//返回一个空字符串。
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return data_.at(key);
|
|
|
|
return data_.at(key);//获取给定键的值
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Kv::add(const std::string &key, const std::string &value) {
|
|
|
|
void Kv::add(const std::string &key, const std::string &value) {//是一个成员函数,用于添加一个键值对
|
|
|
|
if (data_.find(key) != data_.end()) {
|
|
|
|
if (data_.find(key) != data_.end()) {//如果键已经存在
|
|
|
|
fprintf(stderr,
|
|
|
|
fprintf(stderr,
|
|
|
|
"[Kv] find duplicate: %s = %s , ignore\n",
|
|
|
|
"[Kv] find duplicate: %s = %s , ignore\n",
|
|
|
|
key.c_str(),
|
|
|
|
key.c_str(),
|
|
|
|
value.c_str());
|
|
|
|
value.c_str());//会打印一个错误消息并忽略这个添加操作
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
std::string v(value);
|
|
|
|
std::string v(value);
|
|
|
|
#ifdef OS_WINDOWS
|
|
|
|
#ifdef OS_WINDOWS//如果在Windows操作系统上
|
|
|
|
v = utils::utf8_to_gbk(value.c_str());
|
|
|
|
v = utils::utf8_to_gbk(value.c_str()); //将值从UTF-8编码转换为GBK编码。
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
data_[key] = v;
|
|
|
|
data_[key] = v;//添加一个键值对
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Kv::remove(const std::string &key) {
|
|
|
|
void Kv::remove(const std::string &key) {//是一个成员函数,用于删除一个键值对。
|
|
|
|
if (data_.find(key) == data_.end()) {
|
|
|
|
if (data_.find(key) == data_.end()) {//如果键不存在
|
|
|
|
std::cerr << "[Kv] cannot find " << key << std::endl;
|
|
|
|
std::cerr << "[Kv] cannot find " << key << std::endl;//打印一个错误消息。
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
data_.erase(key);
|
|
|
|
data_.erase(key);//删除一个键值对。
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Kv::clear() {
|
|
|
|
void Kv::clear() {//是一个成员函数,用于清空所有的键值对。
|
|
|
|
data_.clear();
|
|
|
|
data_.clear();//用于清空所有的键值对。
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|