在构建基于正倒排索引的搜索引擎时,预处理阶段的通用工具类至关重要。我们将文件读取、字符串处理及中文分词封装为 ns_util 命名空间下的模块,确保项目其他部分能高效复用。
1. FileUtil:文件读取封装
该类负责从指定路径读取文件内容并按行追加到输出字符串中。采用二进制输入模式打开文件,既能保证读取效率,又避免了对原文件的意外修改。若文件打开失败(如路径错误),会输出错误信息并返回 false。
class FileUtil {
public:
static bool ReadFile(const std::string &file_path, std::string *out) {
// 使用 std::ifstream 以二进制输入模式打开文件
std::ifstream in(file_path, std::ios::in | std::ios::binary);
if (!in.is_open()) {
std::cout << "open file " << file_path << ": error" << std::endl;
return false;
}
std::string line;
// getline 重载了 bool 转换操作符,可直接用于循环判断
while (std::getline(in, line)) {
*out += line;
}
in.close();
return true;
}
};
2. JiebaUsutl:静态分词器设计
这里是对 cppjieba 库的封装。核心在于利用 static 成员变量管理词典资源。由于词典初始化成本较高且通常只需一个实例,使用静态成员可确保整个程序运行期间只初始化一次,避免重复创建对象带来的资源消耗。
同时,分词函数 CutString 设为静态成员,无需实例化类即可通过类名调用,简化了接口使用。
const char* const DICT_PATH = "test/cppjieba/dict/jieba.dict.utf8";
const char* const HMM_PATH = "test/cppjieba/dict/hmm_model.utf8";
const * USER_DICT_PATH = ;
* IDF_PATH = ;
* STOP_WORD_PATH = ;
{
:
cppjieba::Jieba jieba;
:
{
jieba.(src, *out);
}
};
;


