跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++AI算法

C++ 搜索引擎通用工具类实现:文件读取与分词集成

C++ 搜索引擎通用工具模块的实现细节,涵盖文件读取、字符串分割及 cppjieba 中文分词器的静态实例化封装。重点解析了文件流处理逻辑、Boost 库的分词策略以及静态成员变量在资源优化中的应用,提供可直接集成的头文件源码参考。

活在当下发布于 2026/3/23更新于 2026/10/1879 浏览
C++ 搜索引擎通用工具类实现:文件读取与分词集成

C++ 搜索引擎通用工具模块

本模块封装了搜索引擎项目中常用的基础功能,包括文件读取、字符串分割及中文分词处理。这些组件在项目的其他部分会被频繁调用,因此独立管理以提高复用性。

1. 文件读取工具 (FileUtil)

该类负责从指定路径读取文件内容。采用二进制输入模式打开文件,确保读取过程中不会修改原文件。函数返回布尔值标识操作是否成功,失败时输出错误信息。

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;
    }
};

2. 字符串分割工具 (StringUtil)

利用 Boost 库提供的 split 函数对目标字符串进行切分。支持自定义分隔符,并可通过 token_compress_on 参数处理连续分隔符合并的情况。

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

3. 中文分词工具 (JiebaUsutl)

此处是对 cppjieba 非标准库的封装。通过静态成员变量管理 Jieba 实例,避免重复初始化带来的资源消耗。分词器依赖词典文件(如主词典、HMM 模型、停用词等),初始化成本较高,使用 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 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);
    }
};

// 静态成员 jieba 的全局初始化,传入各词典路径
// 确保后续调用 CutString 时,jieba 对象已就绪
cppjieba::Jieba JiebaUsutl::jieba(DICT_PATH, HMM_PATH, USER_DICT_PATH, IDF_PATH, STOP_WORD_PATH);

4. 完整源码参考

以下是该模块整合后的完整头文件代码,可直接集成至项目中使用。

#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:
        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. C++ 搜索引擎通用工具模块
  2. 1. 文件读取工具 (FileUtil)
  3. 2. 字符串分割工具 (StringUtil)
  4. 3. 中文分词工具 (JiebaUsutl)
  5. 4. 完整源码参考

更多推荐文章

查看全部
  • 黑客技术入门基础知识详解
  • 用 Java for 循环快速验证算法原型:3 个实用案例
  • FAST_LIO 与 FAST_LIO2 算法原理及环境复现
  • Java 实现:统计数组中出现频率最高的元素
  • Kubernetes Ingress Webhook 验证机制:原理与故障排查
  • LLAMA 模型解析:大语言模型 LLM 推理入门指南
  • Neo4j Desktop 2 本地部署与图数据库实战
  • 无人机智能巡检系统与大疆云端 API 集成实践
  • C++核心语法入门:从命名空间到nullptr
  • 基于 AI 大模型的培训题库自动生成方案与实践
  • 使用 ClawdBot 快速搭建 Telegram 翻译机器人
  • 前缀和算法详解:一维与二维前缀和模板实现
  • AI 大模型:技术趋势、行业应用与未来展望
  • 微博登录流程逆向分析与加密参数实现
  • 机器学习模型评估:8 种算法对比实战
  • 大模型:人工智能前沿技术与应用详解
  • Docker 项目部署实战:后端、前端与数据库配置
  • OpenClaw 开源机器人实现空间智能体记忆技术解析
  • C++17:继 C++11 后的实质性增强与核心特性总结
  • Python 百度搜索接口封装与使用指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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