跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++AI算法

C++ 搜索引擎通用工具模块:文件读取与中文分词实现

综述由AI生成本项目封装了 C++ 搜索引擎所需的通用工具类,涵盖文件读取与中文分词功能。FileUtil 采用二进制流安全读取文件,JiebaUsutl 利用静态成员优化词典初始化性能。整合后的 ns_util 命名空间提供简洁接口,便于搜索引擎核心模块调用。

asphyx_a发布于 2026/3/21更新于 2026/4/298 浏览
C++ 搜索引擎通用工具模块:文件读取与中文分词实现

在基于 Boost 的正倒排索引搜索引擎项目中,我们将高频使用的底层功能封装为通用工具模块,以便在其他组件中复用。主要包括文件读取与中文分词两个核心部分。

文件读取工具 (FileUtil)

该类负责从指定路径读取文件内容,支持按行追加至目标字符串。采用二进制输入模式打开文件,确保读取过程中不会修改原文件数据。若路径错误或无法打开,将输出错误信息并返回 false。

class FileUtil {
public:
    static bool ReadFile(const std::string &file_path, std::string *out) {
        // 使用 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;
    }
};

中文分词工具 (JiebaUsutl)

集成 cppjieba 库进行分词处理。由于词典初始化成本较高且通常只需单例实例,我们采用静态成员变量管理 Jieba 对象。这样既避免了重复创建对象的资源消耗,也保证了分词逻辑的一致性。静态成员函数允许直接通过类名调用,无需实例化对象。

const char* const DICT_PATH = "test/cppjieba/dict/jieba.dict.utf8";
const char* const HMM_PATH = "test/cppjieba/dict/hmm_model.utf8";
const char* const USER_DICT_PATH = "test/cppjieba/dict/user.dict.utf8";
 *  IDF_PATH = ;
 *  STOP_WORD_PATH = ;

  {
:
    
     cppjieba::Jieba jieba;
:
    
    {
        jieba.(src, *out);
    }
};


;
const
char
const
"test/cppjieba/dict/idf.utf8"
const
char
const
"test/cppjieba/dict/stop_words.utf8"
class
JiebaUsutl
private
// 静态成员,全局仅初始化一次
static
public
// 静态方法,直接通过类名调用
static void CutString(const std::string& src, std::vector<std::string>* out)
CutForSearch
// 静态成员初始化,传入词典路径
cppjieba::Jieba JiebaUsutl::jieba(DICT_PATH, HMM_PATH, USER_DICT_PATH, IDF_PATH, STOP_WORD_PATH)

完整头文件实现

以下是整合后的 ns_util 命名空间代码,包含文件读取、字符串分割及分词功能,可直接引入项目使用。

#pragma once
#include<iostream>
#include<string>
#include<fstream>
#include<boost/algorithm/string.hpp>
#include"cppjieba/Jieba.hpp"

namespace ns_util{
    class FileUtil{
    public:
        static bool ReadFile(const std::string &file_path,std::string *out) {
            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;
            while(std::getline(in,line)) *out+=line;
            in.close();
            return true;
        }
    };

    class StringUtil{
    public:
        // target 是要切分的目标,out 是结果容器,sep 是分隔符(\3)
        static void Split(const std::string& target,std::vector<std::string>* out,std::string sep) {
            boost::split(*out,target,boost::is_any_of(sep),boost::token_compress_on);
        }
    };

    const char* const DICT_PATH = "test/cppjieba/dict/jieba.dict.utf8";
    const char* const HMM_PATH = "test/cppjieba/dict/hmm_model.utf8";
    const char* const USER_DICT_PATH = "test/cppjieba/dict/user.dict.utf8";
    const char* const IDF_PATH = "test/cppjieba/dict/idf.utf8";
    const char* const STOP_WORD_PATH = "test/cppjieba/dict/stop_words.utf8";

    class JiebaUsutl{
    private:
        static cppjieba::Jieba jieba;
    public:
        static void CutString(const std::string& src,std::vector<std::string>* out) {
            jieba.CutForSearch(src,*out);
        }
    };
    
    cppjieba::Jieba JiebaUsutl::jieba(DICT_PATH,HMM_PATH,USER_DICT_PATH,IDF_PATH,STOP_WORD_PATH);
}; 

目录

  1. 文件读取工具 (FileUtil)
  2. 中文分词工具 (JiebaUsutl)
  3. 完整头文件实现
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Java 实现决策树算法:从原理到代码实战
  • CSS 基础:width 与 height 尺寸属性详解
  • 学生如何申请和使用 GitHub Copilot
  • MATLAB 多模型 AI 工具箱:支持 DeepSeek/Kimi/GPT 等接入与代码生成
  • 快速排序算法详解
  • DeepSeek 常见误读与行业影响分析
  • GLM-4.6V-Flash-WEB API 额度管理与本地部署指南
  • GitHub 界面中文化插件安装与使用指南
  • 分布式文件系统 HDFS 存储原理详解
  • 2026 年 2 月 AIGC 行业模型发布与前沿技术动态汇总
  • Openclaw 连接本地 Ollama 及 Qwen WebUI 无响应排查
  • MCP 插件配置指南:以 browser-tools-mcp 为例
  • Android WebView 核心配置与实战要点
  • Qwen3.5 开源详解:0.8B 至 397B 模型代际升级与选型指南
  • PyTorch 与 TensorFlow 环境搭建及硬件配置指南
  • LLaMA 模型动态库加载失败排查与修复指南
  • LLaMA-Factory 微调显存参考表:7B 到 72B 模型实测
  • Windows 平台本地 RAG 服务构建:Dify + Ollama + Qwen2.5 部署实践
  • 采摘机器人毕业设计实战:从机械控制到感知决策的全栈实现
  • C/C++ 算法入门:一维动态规划基础实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online