3.编写parser文件使用boost枚举文件名

Boost.Beast C++网络编程实战:从HTTP/WebSocket协议解析到高性能服务开发 在现代C++网络编程中,异步I/O模型和高性能协议处理是构建可扩展服务的关键。Boost.Asio库提供了强大的跨平台异步I/O能力,而基于其构建的Boost.Beast则专门处理HTTP/1.x和WebSocket协议解析与序列化。这项技术通过抽象化的消息容器、序列化器和解析器,将开发者从繁琐的协议细节中解放出来,使其能专注于业务逻辑。其价值在于结合了现代C++的优雅范式与工程实践的高效性,广泛应用于需要清晰、高效网络通信的中间件、实时应用和API客户端等场景。本文以Boost.Beast为例,深入探讨如 阅读详情
编写parser.cc
  1. 在raw_html文件夹中创建一个raw.txt文件
    把所有网页的内容处理完就放到raw.txt中
touch raw.txt

![[Pasted image 20250215101522.png]]

  1. 创建parser.cc
vim parser.cc
#include <iostream>
#include <string>
#include <vector>
#include <boost/filesystem.hpp>

//是一个目录,下面放的是所有的html网页
const std::string src_path = "data/input";
const std::string output = "data/raw_html/raw.txt";

typedef struct DocInfo{
    std::string title;   //文档的标题
    std::string content; //文档内容
    std::string url;     //该文档在官网中的url
}DocInfo_t;

//const &: 输入
//*: 输出
//&:输入输出
bool EnumFile(const std::string &src_path, std::vector<std::string> *files_list);
bool ParseHtml(const std::vector<std::string> &files_list, std::vector<DocInfo_t> *results);
bool SaveHtml(const std::vector<DocInfo_t> &results, const std::string &output);

int main()
{
    std::vector<std::string> files_list;
    
    //第一步: 递归式的把每个html文件名带路径,保存到files_list中,方便后期进行一个一个的文件进行读取
    if(!EnumFile(src_path, &files_list)){
        std::cerr << "enum file name error!" << std::endl;
        return 1;
    }
    
    //第二步: 按照files_list读取每个文件的内容,并进行解析
    std::vector<DocInfo_t> results;
    if(!ParseHtml(files_list, &results)){
        std::cerr << "parse html error" << std::endl;
        return 2;
    }
    
    //第三步: 把解析完毕的各个文件内容,写入到output,按照\3作为每个文档的分割符
    if(!SaveHtml(results, output)){
        std::cerr << "sava html error" << std::endl;
        return 3;
    }
    return 0;
}

bool EnumFile(const std::string &src_path, std::vector<std::string> *files_list)
{
    return true;
}
bool ParseHtml(const std::vector<std::string> &files_list, std::vector<DocInfo_t> *results)
{
	return true;
}
bool SaveHtml(const std::vector<DocInfo_t> &results, const std::string &output)
{
	return true;
}
使用boost枚举文件名
  1. 引用加入boost库
#include <boost/filesystem.hpp>

![[Pasted image 20250215111124.png]]

  1. 安装boost库
sudo yum install -y boost-devel

![[Pasted image 20250215111557.png]]

  1. 编辑EnumFile方法
bool EnumFile(const std::string &src_path, std::vector<std::string> *files_list)
{
    namespace fs = boost::filesystem;
    fs::path root_path(src_path);
    //判断路径是否存在,不存在,就没有必要再往后走了
    if(!fs::exists(root_path)){
        std::cerr << src_path << " not exists" << std::endl;
        return false;
    }
    //定义一个空的迭代器,用来进行判断递归结束
    fs::recursive_directory_iterator end;
    for(fs::recursive_directory_iterator iter(root_path); iter != end; iter++){
        //判断文件是否是普通文件,html都是普通文件
        if(!fs::is_regular_file(*iter)){ 
            continue;
        }
        if(iter->path().extension() != ".html"){ //判断文件路径名的后缀是否符合要求
            continue;
        }
        std::cout << "debug: " << iter->path().string() << std::endl;
        //当前的路径一定是一个合法的,以.html结束的普通网页文件
        files_list->push_back(iter->path().string()); //将所有带路径的html保存在files_list,方便后续进行文本分析
    }
    return true;
}
  1. 将parser.cc追加到makefile
ls parser.cc > makefile

![[Pasted image 20250215115330.png]]

  1. 编写makefile
vim makefile
cc=g++

parser:parser.cc
        $(cc) -o $@ $^ -lboost_system -lboost_filesystem -std=c++11
.PHONY:clean
clean:
        rm -f parser

  1. 安装组件
yum install "gcc-c++.x86_64" -y
  1. 编译
make

![[Pasted image 20250215120647.png]]

  1. 运行parser
./parser

![[Pasted image 20250215133717.png]]

  1. 查看html文件个数
./parser | wc -l

![[Pasted image 20250215133646.png]]

C++实现具身智能上位机TCP通讯:从协议设计到实时调度实战 TCP/IP协议作为网络通信的基石,以其可靠、有序的流式传输特性,在需要确保指令准确无误送达的工业控制与机器人领域成为首选。其核心原理在于通过三次握手建立稳定连接,并在应用层之上自定义协议来解决粘包、半包问题,从而保障数据完整性。这一技术价值在于为分布式系统提供了坚实的通讯骨架,是实现实时控制与状态同步的关键。在具身智能(Embodied AI)和机器人精密装配等应用场景中,智能体上位机作为系统的“神经中枢”,正是通过稳定的TCP通讯这条“神经纤维”,与下位机(如嵌入式控制器)进行高效、可靠的指令与数据交换 阅读详情

相关推荐

C++命令行参数解析:cxxopts库入门与实践指南

命令行参数解析是软件开发中的基础技术,用于处理用户输入的程序配置选项。其核心原理是将字符串形式的命令行参数转换为程序内部可用的结构化数据,涉及参数定义、类型转换、验证和帮助信息生成等环节。这项技术的价值在于提升开发效率,通过自动化处理繁琐的解析逻辑,让开发者更专注于核心业务实现。在应用场景上,它广泛用于CLI工具、后台服务、批处理脚本等需要复杂配置的程序中。cxxopts作为一款现代C++11头文件库,采用声明式配置替代传统过程式解析,显著减少了样板代码。其纯头文件设计便于集成,同时支持位置参数、多值参数和

weixin_30522183的博客 385

[项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 | scp

本文介绍了搜索引擎项目的背景、宏观原理和技术栈,重点讲解了正排索引与倒排索引的差异,并展示了如何使用Parser进行数据清洗及Linux下文件传输技巧。

No Game No Life 4293

深入解析 nlohmann/json:C++ JSON 库的核心机制与高级应用

JSON 作为一种轻量级的数据交换格式,在现代软件开发中扮演着至关重要的角色,尤其在 Web API、配置文件和数据持久化等场景。其核心原理在于通过键值对和数组结构,实现跨平台、语言无关的数据序列化与反序列化。在 C++ 生态中,高效、易用地处理 JSON 数据是提升开发效率和系统性能的关键技术价值。nlohmann/json 库通过精妙的模板元编程和类型擦除机制,在保证类型安全的同时,提供了直观的 API 和卓越的易用性。它支持 DOM 与 SAX 两种解析模式,前者便于随机访问,后者则能以流式、低内存的

weixin_30387799的博客 426

C++ 基于正倒排索引的 Boost 搜索引擎

这篇文章介绍了一个基于C++的Boost库文档站内搜索引擎的实现过程。主要内容包括: 项目背景 实现一个类似百度但规模较小的站内搜索引擎,针对Boost库官网文档进行搜索。 搜索引擎原理 抓取:下载Boost官网HTML文档 处理:去除HTML标签,提取正文内容 索引: 正排索引:文档ID到文档内容 倒排索引:关键词到文档ID列表 排序:根据关键词权重排序结果 技术实现 使用Boost文件系统遍历文档 正排索引存储文档标题、内容和URL 倒排索引使用cppjieba进行中文分词 通过cpp-httplib搭

wefg1的博客 734

POCO C++库入门指南:20分钟搭建跨平台HTTP服务器

在C++网络编程和服务器开发中,跨平台兼容性和底层系统抽象是开发者常面临的核心挑战。传统方式需要手动处理socket封装、SSL/TLS加密等复杂细节,导致代码冗余和维护困难。POCO C++库作为一套完整的企业级工具包,通过提供优雅直观的API,有效屏蔽了平台差异,让开发者能专注于业务逻辑实现。其模块化设计覆盖了字符串处理、文件操作、多线程、HTTP/HTTPS网络协议、数据库访问及JSON/XML序列化等现代应用开发需求,特别适合需要快速构建跨平台网络服务的后端工程师。本文将以搭建简易HTTP服务器为例

weixin_34290096的博客 386

C++实现ASN.1 DER TLV解析器:从X.509证书到二进制数据解析

在网络安全和通信协议中,数据序列化与解析是核心技术基础。ASN.1(抽象语法标记一)作为一种数据描述语言,配合DER(可辨别编码规则)编码,广泛应用于X.509证书、3GPP信令等场景。其核心编码单元TLV(标签-长度-值)通过标签标识数据类型、长度字段指示数据大小、值字段承载实际内容,形成自描述数据结构。理解TLV解析原理不仅能深入理解密码学基础设施,还能为处理自定义二进制协议(如SOME/IP序列化、DHCP报文解析)提供通用能力。本文通过C++实现一个完整的ASN.1 DER解析器,结合X.509证书

weixin_30268921的博客 389

【Boost搜索引擎】构建Boost站内搜索引擎实践

本项目实现了一个基于C++的搜索引擎,技术栈包括C++11、STL、Boost、Jsoncpp、cppjieba和cpp-httplib,运行环境为Ubuntu 22.04。项目通过正排索引和倒排索引实现文档的快速检索,正排索引存储文档内容,倒排索引通过分词将关键词映射到文档ID。项目还实现了数据清洗模块,去除HTML标签并提取有效内容。搜索模块通过分词、倒排索引查找、结果合并排序等步骤,最终返回JSON格式的搜索结果。前端使用HTML、CSS和JavaScript实现,通过HTTP请求与后端交互,展示搜索

uyeonashi的博客 1351

C#、VB.NET与C++多语言IFC文件解析实战:从Xbim到IfcOpenShell

在建筑信息模型(BIM)与工业数据交换领域,IFC(工业基础类)作为开放中立的国际标准,是实现跨平台、跨专业数据互操作的核心。其本质是一种基于EXPRESS语言定义的面向对象数据模型,通过标准化的实体、属性与关系描述,承载了建筑构件的几何、语义及关联信息。理解IFC的数据结构与SPF文件格式是进行有效解析的基础。从技术价值看,高效解析IFC文件能解锁模型数据的深度应用,如工程量统计、性能分析、碰撞检测与数字化交付。在实际工程中,针对不同应用场景与性能需求,开发者常需选用不同的技术栈:利用C#和Xbim库可快

weixin_31856057的博客 224

Boost库搜索引擎结项总结

我们在给用户返回时,要返回的是一个html文件的内容。

qq_57123434的博客 609

SAP批量程序(一)-静态批量EX,FX和期间批量MB,WB和TB

SAP批量程序(一)-静态批量和区间批量

weixin_38974136的博客 5476

Star CCM+中的物性参数(定值、多项式、查表)

仿真过程中我们一定会遇到设置物性参数的问题,对于固定的物性参数还好说,直接输入一个固定的值即可。但是对于冷却液、气体、两相流等,物性参数是随着温度或温度和压力变化的。此时就涉及到多项式和查表。首先创建物理连续体,选择计算模型。

2201_75375391的博客 2957

CPP-Reflection完全指南:从零开始掌握C++反射解析与运行时框架

C++反射(CPP-Reflection)是一个强大的C++反射解析与运行时框架,它为开发者提供了在编译期解析代码结构并在运行时动态访问类型信息的能力。本指南将带你从零开始了解这个框架的核心功能、构建方法和实际应用,帮助你快速掌握C++反射技术的精髓。 ## 🚀 什么是CPP-Reflection? CPP-Reflection是一个完整的C++反射管道,包含**反射解析器**(Parser

gitblog_00565的博客 135

从FreeCAD到BIMBase:PlaneGCS约束求解器的移植使用指南

本文为BIMBase平台的开发者提供了一份详细的PlaneGCS几何约束求解器移植与集成指南。文章深入探讨了如何从FreeCAD中提取PlaneGCS核心代码,并将其适配到BIMBase的C++二次开发环境中,重点解决了内存管理、数据模型桥接、约束抽象以及性能调优等关键问题,旨在帮助开发者构建稳定高效的参数化设计模块。

weixin_29213525的博客 320

C++命令行参数解析:argh轻量库入门与实战指南

命令行参数解析是软件开发中的基础技术,用于处理用户输入的命令行选项和参数,如`-h`、`--file`等。其核心原理是通过解析`argc`和`argv`参数,将字符串形式的输入转换为程序内部可用的结构化数据。这项技术对于构建可配置、用户友好的命令行工具至关重要,广泛应用于系统工具、开发脚本、后台服务及各类实用程序。在C++生态中,传统方案如`getopt`功能简陋,而`Boost.Program_options`等重型库又存在依赖复杂、编译慢的问题。argh库以其轻量级、单头文件的特性,提供了零依赖的现代C

weixin_33766805的博客 356

ad23新版Geber导出-官方教程(22.11版本后)

AD23新版本geber文件导出(含官方教程)-22.11之后的版本均可用此教程

安和的博客 3万+

YOLOV8主干改进方法:C2f-Dual——DualConv轻量化双卷积设计(附改进代码)

DualConv是一种创新的卷积网络结构,旨在构建轻量级的深度神经网络。它通过结合3×3和1×1的卷积核处理相同的输入特征映射通道,优化了信息处理和特征提取。DualConv利用组卷积技术高效排列卷积滤波器,大大降低了计算成本和参数数量。

m0_74890428的博客 4698

5 分钟上手 C++ JSON 解析与生成库 jsonxx:轻量 JSON 库的完整指南

jsonxx 是一个轻量级的 C++ JSON 解析与生成库:一个源文件、一个头文件、零依赖,MIT 许可,拉下来就能用。适合想在 C++ 里处理 JSON、又不想背上沉重构建系统的同学。下面带你在 5 分钟内跑通解析与生成,再看它有哪些不一般的灵活之处。 ## 它解决了什么痛点 很多 C++ 项目要接 Web API、读 JSON 配置,但现成方案要么拖进庞大依赖、要么构建配置繁琐。json

gitblog_00201的博客 510

零基础入门simulink1000例--第112例:在 Simulink 中构建一个基本的相控阵雷达波束形成系统仿真模型

摘要:本文详细介绍了使用Simulink实现相控阵雷达波束形成技术的完整流程。从创建Simulink模型、设计天线阵列、信号生成,到波束形成算法实现和结果可视化,涵盖了关键步骤。文章重点讲解了均匀线性阵列的设计、线性调频信号生成、相位偏移计算等核心技术,并提供了MATLAB代码示例。通过Scope或ArrayPlot模块进行结果分析,最终可导出为嵌入式代码部署。该系统展现了电子扫描波束的技术优势,为雷达系统设计提供了有效的仿真方法。

amy_mhd的博客 209

C++跨平台命令行参数解析:从原理到实现GetCommandText()

命令行参数解析是C/C++开发中处理用户输入与程序配置的基础技术,它涉及如何从main函数的argc/argv中提取和结构化参数。其核心原理在于识别参数类型(如标志、选项、位置参数),并处理不同平台(Windows/Linux/macOS)在参数传递、字符编码上的差异。这项技术的工程价值在于提升开发效率、增强程序健壮性,并统一跨平台行为,是构建命令行工具、后台服务及可配置应用程序的关键组件。本文聚焦于跨平台场景,通过设计一个轻量级的CommandLineParser类,深入探讨了如何实现一个统一的GetCo

weixin_34025051的博客 407

数字人(对嘴型 Lip-sync)数据集 LRS2 介绍(含网盘链接)

LRS2(Lip Reading Sentences 2)是牛津大学与BBC合作开发的一个大规模唇语识别数据集,专门用于训练和评估数字人唇语同步(Lip-sync)技术。该数据集包含数千条来自BBC电视节目的口语句子,每个句子长度最多100个字符。官方网站为:https://www.robots.ox.ac.uk/~vgg/data/lip_reading/lrs2.html可惜需要认证,不过我已经下载好并存到网盘里了,有需要可适用如下链接下载。(仅供学习,请勿传播)

iioSnail的博客 1681

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

从零搭建现代化C++文档项目:Doxygen+Sphinx+Breathe工具链实战

在软件工程实践中,项目文档是保障代码可维护性和团队协作效率的关键基础设施。其核心原理在于将文档视为与代码同等重要的一等公民,通过自动化工具链实现文档与代码的同步演进。现代C++项目文档体系的技术价值在于解决大型代码库的知识传承难题,降低新成员上手成本,并提升项目的整体专业度。典型的应用场景包括开源库的API参考、商业应用的设计文档以及团队内部的架构说明。本文聚焦于C++文档项目的实战搭建,详细介绍了如何整合Doxygen、Sphinx和Breathe等核心工具,实现从代码注释提取到美观网站生成的完整工作流,

weixin_33743703的博客 367

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Whoosh电商搜索实战:商品索引设计与查询优化指南

想要为自己的电商网站加上一套**电商搜索**能力,却不想引入笨重的 Elasticsearch?**Whoosh** 这款纯 Python 编写的全文搜索库,正是中小型电商项目快速落地的理想选择。它无需编译、无需独立服务,用熟悉的 Python 语法就能完成**商品索引设计**、关键词检索与**查询优化**。本文将带你从零开始,掌握用 Whoosh 搭建商品搜索的全部关键步骤。 ## 为什么电商

gitblog_00736的博客 400

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

并行分布式框架:Celery、rq、funboost

Celery是一个异步任务的调度工具,也可以叫做 "分布式任务队列(Distributed Task Queue)"。

freeking101的博客 5万+

Ubuntu 14.04下部署BIND权威DNS服务器实战指南

DNS(域名系统)是局域网服务发现与命名管理的核心基础设施,其本质是将易记的主机名映射为IP地址的分布式数据库。BIND作为最成熟、可定制性最强的开源DNS实现,特别适合构建私有网络中的权威DNS服务器——它不对外递归查询,专注响应内网域名解析请求,从而保障命名一致性、服务自动发现和故障隔离能力。在工业物联网、嵌入式集成等对稳定性要求极高的场景中,基于Ubuntu 14.04+BIND 9.9.5的组合虽版本较旧,却因内核兼容性好、ABI稳定、长期验证充分而具备不可替代的工程价值。本文聚焦bind配置dns

weixin_34218579的博客 380

CodeWarrior IDE代码浏览器实战:从数据库生成到高效导航

代码浏览器是集成开发环境(IDE)中的核心功能,它通过构建符号索引数据库,实现了对大型代码库的高效导航与理解。其工作原理基于对源代码的静态分析,提取类、函数、变量等符号及其关联关系,并存储为结构化的数据。这项技术的核心价值在于,它将开发者从繁琐的文本搜索中解放出来,通过图形化界面和精准跳转,极大地提升了代码阅读、理解和维护的效率。在嵌入式开发、大型遗留系统维护以及快速迭代的新项目中,代码浏览器能帮助开发者快速理清复杂的类继承体系、定位函数定义、分析调用关系,是提升工程实践能力的必备工具。本文以CodeWar

weixin_34378969的博客 370
上一篇: 2.认识标签和去标签|下载boost库|建立项目结构
下一篇: 4.完成html文件读取|获取title|获取content|构建url|调试(C++)
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值