字典文件管理器类

时间:2015-07-31 00:43:09

标签: c++ dictionary

字典类从文件加载条目,然后可以对它们执行操作。然后,字典类将条目存储回文件中。

我想知道检查我的字典成员函数的参数是否是有效术语/定义的最佳方法。我想到了两种可能的解决方案,但我对任何其他解决方案持开放态度。我可以检查传递给函数的参数,或者创建一个术语和定义类,然后检查类。

我想区分字符串与术语/定义的原因是我可以从文件中读取它们,而不必遇到定义不会在句点或其他情况下因人为错误而导致的情况。

这是我现在的代码。

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

1 个答案:

答案 0 :(得分:0)

首先,我必须指出,你使用了std :: map,但你自己实现了search_item,你不知道std :: map :: find()?

然后让我们谈谈你的解决方案。 如果您的词典中的项目很少,那么您的解决方案就可以 否则,你怎么能保存内存中项目的所有定义? 所以,我给你两个可能的解决方案:

  1. 使用数据库,MySQL(大一号),Sqlite(精简版)

  2. 在一个单独的文件中保存定义,只读出每个的偏移量,并将偏移量映射到项目。(意味着实现数据库自己做的事情)。