字典类从文件加载条目,然后可以对它们执行操作。然后,字典类将条目存储回文件中。
我想知道检查我的字典成员函数的参数是否是有效术语/定义的最佳方法。我想到了两种可能的解决方案,但我对任何其他解决方案持开放态度。我可以检查传递给函数的参数,或者创建一个术语和定义类,然后检查类。
我想区分字符串与术语/定义的原因是我可以从文件中读取它们,而不必遇到定义不会在句点或其他情况下因人为错误而导致的情况。
这是我现在的代码。
dictionary.cpp
#include "dictionary.h"
//*** @TODO: What constitutes a term/definition ***
bool dictionary::search_term(const std::string& term){
for(auto& it: entries){
if(it.first != term);
else return true;
}return false;
};
bool dictionary::erase_entry(const std::string& term){
if(search_term(term)){
entries.erase(term);
return true;
}else return false;
};
bool dictionary::define_term(const std::string& term, const std::string& definition){
if(search_term(term)){
entries[term] = definition;
return true;
}else return false;
};
bool dictionary::write_entry(const std::string& term, const std::string& definition){
if(!search_term(term)){
entries[term] = definition;
return true;
}else return false;
};
inline bool exists (const std::string& name) {
struct stat buffer;
return (stat (name.c_str(), &buffer) == 0);
}
bool dictionary::ofs_entries(const std::string& path){
std::string file = (path + title);
std::ofstream ofs(file.c_str());
if(!ofs) return false;
for(auto& it: entries){
ofs << it.first << ": " << it.second << '\n';
}ofs.close();
};
bool dictionary::ifs_entries(const std::string& path){
std::string file = (path + title);
if(!exists(file)) return false;
std::ifstream ifs(file.c_str());
if(!ifs) return false;
std::string entry;
while(true){
//read entries
if(!ifs.eof()) break;
}return true;
};
dictionary.h
#ifndef DICTIONARY_H
#define DICTIONARY_H
#include <algorithm>
#include <iterator>
#include <fstream>
#include <string>
#include <map>
class dictionary{
public:
dictionary(const std::string& title, const std::string& definition = "")
: entries{{title, definition}}, title(title){;};
bool write_entry(const std::string& term, const std::string& definition = "");
bool define_term(const std::string& term, const std::string& definition);
bool erase_entry(const std::string& term);
bool search_term(const std::string& term);
bool ofs_entries(const std::string& path);
bool ifs_entries(const std::string& path);
private:
std::map<std::string, std::string> entries;
std::string title;
};
#endif//DICTIONARY_H
答案 0 :(得分:0)
首先,我必须指出,你使用了std :: map,但你自己实现了search_item,你不知道std :: map :: find()?
然后让我们谈谈你的解决方案。 如果您的词典中的项目很少,那么您的解决方案就可以 否则,你怎么能保存内存中项目的所有定义? 所以,我给你两个可能的解决方案:
使用数据库,MySQL(大一号),Sqlite(精简版)
在一个单独的文件中保存定义,只读出每个的偏移量,并将偏移量映射到项目。(意味着实现数据库自己做的事情)。