<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>知星悟地</title><link>https://geowisdom.com.cn/</link><description>Recent content on 知星悟地</description><generator>Hugo -- 0.153.2</generator><language>en-us</language><lastBuildDate>Sun, 10 May 2026 08:00:00 +0800</lastBuildDate><atom:link href="https://geowisdom.com.cn/index.xml" rel="self" type="application/rss+xml"/><item><title>dsv_table: 一文看懂 C++ 高性能表格数据处理</title><link>https://geowisdom.com.cn/posts/resource/utilsxx/readme_dsv_table/</link><pubDate>Sun, 10 May 2026 08:00:00 +0800</pubDate><guid>https://geowisdom.com.cn/posts/resource/utilsxx/readme_dsv_table/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;在科学计算、数据分析和工程应用中，表格数据（如 CSV、TSV、空格分隔文件）是最常见的数据格式之一。然而，C++ 标准库并未提供开箱即用的表格处理工具，开发者往往需要自己编写解析逻辑，处理分隔符、表头、注释、空值等琐碎问题。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;dsv_table&lt;/code&gt; 是 &lt;a href="https://github.com/geophyxx/utilsxx"&gt;utilsxx&lt;/a&gt; 库中的一个核心组件，它提供了一套&lt;strong&gt;完整的表格数据读写与操作方案&lt;/strong&gt;，支持多种分隔格式、灵活的行列访问、数据过滤与排序，以及 JSON 互操作。本文将带你从零开始，一文看懂 &lt;code&gt;dsv_table&lt;/code&gt; 的设计理念与使用技巧。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一什么是-dsv_table"&gt;一、什么是 dsv_table？&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dsv_table&lt;/code&gt; 中的 &lt;strong&gt;DSV&lt;/strong&gt; 是 &lt;strong&gt;Delimiter-Separated Values&lt;/strong&gt; 的缩写，泛指所有以分隔符（逗号、空格、竖线等）组织的文本表格格式。&lt;code&gt;dsv_table&lt;/code&gt; 不仅能处理 CSV，还能处理任意自定义分隔符的文本文件。&lt;/p&gt;
&lt;h3 id="核心设计特点"&gt;核心设计特点&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;统一存储&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;所有单元格内部以字符串存储，支持按需转换为 &lt;code&gt;int&lt;/code&gt;、&lt;code&gt;double&lt;/code&gt;、&lt;code&gt;std::string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;类型标记&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;每个单元格带有 &lt;code&gt;String&lt;/code&gt; / &lt;code&gt;Int&lt;/code&gt; / &lt;code&gt;Float&lt;/code&gt; 类型标记，影响输出行为&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;输出控制&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;可单独控制行/列/单元格的输出开关（&lt;code&gt;Enable&lt;/code&gt;/&lt;code&gt;Disable&lt;/code&gt;），实现&amp;quot;软删除&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;行列命名&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;支持通过名称（如 &lt;code&gt;&amp;quot;SurfaceArea_n&amp;quot;&lt;/code&gt;）或内置编号（如 &lt;code&gt;R3&lt;/code&gt;、&lt;code&gt;C5&lt;/code&gt;）访问&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;多格式支持&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;原生支持 &lt;code&gt;.txt&lt;/code&gt;、&lt;code&gt;.csv&lt;/code&gt;、&lt;code&gt;.json&lt;/code&gt; 的读写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;头信息/注释/标记&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;文件中的注释行、标记行、头信息行会被自动提取并保留&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="二快速上手"&gt;二、快速上手&lt;/h2&gt;
&lt;h3 id="21-基本加载与查看"&gt;2.1 基本加载与查看&lt;/h3&gt;
&lt;p&gt;假设我们有一个 CSV 文件 &lt;code&gt;sample_data.csv&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;id&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;lon&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;lat&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;depth&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;den&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;sus&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;name&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;date&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;location&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;,&lt;span style="color:#e6db74"&gt;32.23&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;65.23&lt;/span&gt;,,&lt;span style="color:#e6db74"&gt;2.3&lt;/span&gt;,,&lt;span style="color:#e6db74"&gt;gabbro&lt;/span&gt;,,&lt;span style="color:#e6db74"&gt;&amp;#34;enshi, hubei&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;,&lt;span style="color:#e6db74"&gt;65.2&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;12.7&lt;/span&gt;,,&lt;span style="color:#e6db74"&gt;2.5&lt;/span&gt;,,&lt;span style="color:#e6db74"&gt;basalt&lt;/span&gt;,,&lt;span style="color:#e6db74"&gt;&amp;#34;wuhan&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;,&lt;span style="color:#e6db74"&gt;70.23&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;10.6&lt;/span&gt;,,&lt;span style="color:#e6db74"&gt;3.1&lt;/span&gt;,,&lt;span style="color:#e6db74"&gt;volcanic&lt;/span&gt;,,&lt;span style="color:#e6db74"&gt;&amp;#34;hangzhou, zhejiang&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;加载并查看列信息：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;#34;dsv_table.hpp&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; utilsxx&lt;span style="color:#f92672"&gt;::&lt;/span&gt;dsv_table t(&lt;span style="color:#e6db74"&gt;&amp;#34;data/sample_data&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;.csv&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; t.info(utilsxx&lt;span style="color:#f92672"&gt;::&lt;/span&gt;ColInfo); &lt;span style="color:#75715e"&gt;// 打印列信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;</description></item><item><title>get_option: C++ 配置文件解析，一文从入门到精通</title><link>https://geowisdom.com.cn/posts/resource/utilsxx/readme_get_option/</link><pubDate>Sun, 10 May 2026 08:00:00 +0800</pubDate><guid>https://geowisdom.com.cn/posts/resource/utilsxx/readme_get_option/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;几乎每个非平凡的程序都需要配置参数：输入文件路径、算法阈值、输出格式、模型参数……硬编码这些值会让程序失去灵活性，而手写解析逻辑又繁琐且容易出错。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;getoption&lt;/code&gt; 是 &lt;a href="https://github.com/geophyxx/utilsxx"&gt;utilsxx&lt;/a&gt; 库中的轻量级配置解析组件。它采用&lt;strong&gt;声明式&lt;/strong&gt;设计理念：你先声明程序需要哪些参数、哪些是必填的、哪些参数属于互斥组，然后从文件或字符串向量中读取配置，&lt;code&gt;getoption&lt;/code&gt; 会自动完成解析、校验和类型转换。本文将带你从基础用法到高阶技巧，彻底掌握这个工具。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一设计理念声明式配置管理"&gt;一、设计理念：声明式配置管理&lt;/h2&gt;
&lt;p&gt;传统的配置解析往往是&amp;quot;命令式&amp;quot;的：读一行、判断键名、手动转换类型、检查是否缺失。&lt;code&gt;getoption&lt;/code&gt; 将其转变为&amp;quot;声明式&amp;quot;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 1. 声明：我的程序需要这些参数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;getoption gopt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gopt.add_options({&lt;span style="color:#e6db74"&gt;&amp;#34;range&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;interval&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;output&amp;#34;&lt;/span&gt;}, {true, true, false});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 2. 读取：从配置文件加载
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gopt.read_options(&lt;span style="color:#e6db74"&gt;&amp;#34;config.txt&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 3. 校验：自动检查必填项和互斥组
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gopt.check_mandatory();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 4. 使用：直接获取已转换类型的值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;auto&lt;/span&gt; range &lt;span style="color:#f92672"&gt;=&lt;/span&gt; gopt.get_value&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;range&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;auto&lt;/span&gt; weight &lt;span style="color:#f92672"&gt;=&lt;/span&gt; gopt.get_values&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;|&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这种设计的优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;集中管理&lt;/strong&gt;：所有参数定义在一处，一目了然&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动校验&lt;/strong&gt;：必填项、互斥组自动检查，无需手写 &lt;code&gt;if&lt;/code&gt; 判断&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类型安全&lt;/strong&gt;：模板函数自动完成字符串到目标类型的转换&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;别名支持&lt;/strong&gt;：一个参数可以有多个名称（如 &lt;code&gt;model-file&lt;/code&gt;/&lt;code&gt;ModelFile&lt;/code&gt;/&lt;code&gt;model_file&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二快速上手"&gt;二、快速上手&lt;/h2&gt;
&lt;h3 id="21-配置文件格式"&gt;2.1 配置文件格式&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;getoption&lt;/code&gt; 使用简洁的 &lt;strong&gt;key-value&lt;/strong&gt; 格式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# 以 # 开头的行是注释，会被自动跳过
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;range = 100/1000/200/2000/full_range
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;interval = 10/10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;weight = 120.12/232/114.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;model-file = test.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# 空行也会被跳过，不影响解析
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# 同一个 key 可以出现多次，值会自动合并
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;model-tag = model1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;model-tag = model2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;model-tag = model3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;out-model = example.msh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;格式规则：&lt;/p&gt;</description></item><item><title>process_monitor: C++ 交互式进程监控，让科学计算可控可停</title><link>https://geowisdom.com.cn/posts/resource/utilsxx/readme_process_monitor/</link><pubDate>Sun, 10 May 2026 08:00:00 +0800</pubDate><guid>https://geowisdom.com.cn/posts/resource/utilsxx/readme_process_monitor/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;科学计算程序往往需要运行数分钟甚至数小时。在这漫长的等待中，用户常常面临几个痛点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;程序是否在正常运行？进度如何？&lt;/li&gt;
&lt;li&gt;发现参数设置有误，能否暂停调整而不是强制终止？&lt;/li&gt;
&lt;li&gt;想查看当前中间结果，又不想打断计算流程？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;process_monitor&lt;/code&gt; 是 &lt;a href="https://github.com/geophyxx/utilsxx"&gt;utilsxx&lt;/a&gt; 库中的交互式进程监控组件。它以&lt;strong&gt;非侵入式&lt;/strong&gt;的设计理念，让你只需继承一个基类、重写几个虚函数，就能为任何计算任务赋予&lt;strong&gt;暂停/继续/状态查看/安全退出&lt;/strong&gt;的交互能力。本文将带你彻底掌握它的设计与使用。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一核心设计为什么需要-process_monitor"&gt;一、核心设计：为什么需要 process_monitor？&lt;/h2&gt;
&lt;h3 id="11-传统方案的局限"&gt;1.1 传统方案的局限&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+C&lt;/code&gt; 强制终止&lt;/td&gt;
&lt;td&gt;丢失中间结果，无法优雅收尾&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;信号处理（&lt;code&gt;SIGINT&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;跨平台差异大，代码复杂&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日志文件轮询&lt;/td&gt;
&lt;td&gt;实时性差，无法交互控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;独立 GUI 监控&lt;/td&gt;
&lt;td&gt;引入重量级依赖，不适合服务器环境&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-process_monitor-的设计哲学"&gt;1.2 process_monitor 的设计哲学&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非侵入式&lt;/strong&gt;：你的计算逻辑几乎不用修改，只需在循环中插入一行 &lt;code&gt;wait_for_keyboard()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨平台&lt;/strong&gt;：Windows（&lt;code&gt;_kbhit&lt;/code&gt;/&lt;code&gt;_getch&lt;/code&gt;）和 Unix（&lt;code&gt;termios&lt;/code&gt;/&lt;code&gt;select&lt;/code&gt;）统一封装&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;线程安全&lt;/strong&gt;：键盘监控与计算逻辑分离，通过条件变量同步&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展&lt;/strong&gt;：所有交互行为都是虚函数，可按需重写&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="13-状态机模型"&gt;1.3 状态机模型&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;RUNNING --[pause_key]--&amp;gt; PAUSED --[continue_key]--&amp;gt; RUNNING
| |
|--[quit_key] |--[quit_key]
v v
STOPPED &amp;lt;----------------- STOPPED
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二快速上手"&gt;二、快速上手&lt;/h2&gt;
&lt;h3 id="21-最小示例"&gt;2.1 最小示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;#34;process_monitor.h&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyCalculator&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; utilsxx&lt;span style="color:#f92672"&gt;::&lt;/span&gt;process_monitor {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; process() &lt;span style="color:#66d9ef"&gt;override&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;end_process()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 你的计算逻辑...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; do_calculation_step();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 每秒钟检查一次键盘输入
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wait_for_keyboard(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MyCalculator calc;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; calc.start_monitoring();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行后，你可以随时按下：&lt;/p&gt;</description></item><item><title>progress_bar: C++ 终端进度条，一文从入门到高阶</title><link>https://geowisdom.com.cn/posts/resource/utilsxx/readme_progress_bar/</link><pubDate>Sun, 10 May 2026 08:00:00 +0800</pubDate><guid>https://geowisdom.com.cn/posts/resource/utilsxx/readme_progress_bar/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;命令行程序在处理耗时任务时，一个直观的进度条能极大提升用户体验。然而 C++ 标准库并未提供终端进度条组件，开发者要么引入重型第三方库，要么自己手写 ANSI 转义码控制光标。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;progress_bar&lt;/code&gt; 是 &lt;a href="https://github.com/geophyxx/utilsxx"&gt;utilsxx&lt;/a&gt; 库中的轻量级终端进度条组件，它&lt;strong&gt;零依赖、跨平台、开箱即用&lt;/strong&gt;，同时提供了 &lt;code&gt;indicators&lt;/code&gt; 第三方库的集成示例，满足不同场景需求。本文将带你一文看懂如何使用它，以及有哪些实用技巧。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一快速上手三行代码显示进度条"&gt;一、快速上手：三行代码显示进度条&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;#34;progress_bar.hpp&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; utilsxx&lt;span style="color:#f92672"&gt;::&lt;/span&gt;progress_bar bar(&lt;span style="color:#e6db74"&gt;&amp;#34;Processing&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;101&lt;/span&gt;; &lt;span style="color:#f92672"&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bar.tick(); &lt;span style="color:#75715e"&gt;// 每步调用一次
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 你的耗时操作...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;终端输出效果：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Processing |████████████████████████████████████████░░░░░░░░░░| 75.0%
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二核心设计"&gt;二、核心设计&lt;/h2&gt;
&lt;h3 id="21-两种显示模式"&gt;2.1 两种显示模式&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模式&lt;/th&gt;
&lt;th&gt;枚举值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;完整模式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Full&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;进度条 + 百分比数字（默认）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;数字模式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NumberOnly&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;仅显示百分比数字，无图形条&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="22-颜色系统"&gt;2.2 颜色系统&lt;/h3&gt;
&lt;p&gt;支持已完成部分和未完成部分分别设置颜色：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;颜色&lt;/th&gt;
&lt;th&gt;枚举值&lt;/th&gt;
&lt;th&gt;ANSI 效果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;白色&lt;/td&gt;
&lt;td&gt;&lt;code&gt;White&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;默认粗体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;绿色&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Green&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;粗体绿色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;红色&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Red&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;粗体红色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;蓝色&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Blue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;粗体蓝色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;黄色&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Yellow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;粗体黄色&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="23-智能宽度适配"&gt;2.3 智能宽度适配&lt;/h3&gt;
&lt;p&gt;进度条长度&lt;strong&gt;自动根据终端宽度计算&lt;/strong&gt;，无需手动调整：&lt;/p&gt;</description></item><item><title>toml11: C++ TOML 解析完全指南</title><link>https://geowisdom.com.cn/posts/resource/utilsxx/readme_toml11/</link><pubDate>Sun, 10 May 2026 08:00:00 +0800</pubDate><guid>https://geowisdom.com.cn/posts/resource/utilsxx/readme_toml11/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;在程序配置领域，TOML（Tom&amp;rsquo;s Obvious, Minimal Language）凭借其直观的语法和强类型特性，逐渐成为 JSON 和 YAML 的有力替代者。与 JSON 相比，TOML 支持注释、更易于手写；与 YAML 相比，TOML 语法更严格、歧义更少。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ToruNiina/toml11"&gt;toml11&lt;/a&gt; 是一个现代 C++17 的 TOML 解析库，以&lt;strong&gt;header-only&lt;/strong&gt;、&lt;strong&gt;类型安全&lt;/strong&gt;、&lt;strong&gt;异常友好&lt;/strong&gt;著称。utilsxx 将其作为外部组件集成到 &lt;a href="lib/toml.hpp"&gt;&lt;code&gt;lib/toml.hpp&lt;/code&gt;&lt;/a&gt; 中，方便项目直接使用。本文将基于 toml11 的完整功能，结合 utilsxx 中的示例，带你彻底掌握 TOML 在 C++ 中的读写技巧。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一toml-速览"&gt;一、TOML 速览&lt;/h2&gt;
&lt;h3 id="11-为什么选择-toml"&gt;1.1 为什么选择 TOML？&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;TOML&lt;/th&gt;
&lt;th&gt;JSON&lt;/th&gt;
&lt;th&gt;YAML&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;注释支持&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;强类型&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌（隐式转换多）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;手写友好&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️（缩进敏感）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日期时间&lt;/td&gt;
&lt;td&gt;✅ 原生&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;表（Table）&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌（用对象模拟）&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;歧义性&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-toml-核心语法"&gt;1.2 TOML 核心语法&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 这是注释&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 键值对（基本类型）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;title&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;TOML Example&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;enabled&lt;/span&gt; = &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;port&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;pi&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;3.14159&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 表（类似 JSON 的对象）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#a6e22e"&gt;owner&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;Tom Preston-Werner&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;dob&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;1979-05-27T07:32:00-08:00&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 嵌套表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#a6e22e"&gt;servers&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;alpha&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ip&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;10.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;role&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 数组&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ports&lt;/span&gt; = [&lt;span style="color:#ae81ff"&gt;8000&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;8001&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;8002&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 表数组（数组的每个元素是一个表）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;products&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;Hammer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sku&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;738594937&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[[&lt;span style="color:#a6e22e"&gt;products&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;Nail&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sku&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;284758393&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="二快速上手"&gt;二、快速上手&lt;/h2&gt;
&lt;h3 id="21-解析-toml-文件"&gt;2.1 解析 TOML 文件&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;#34;toml.hpp&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 解析文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;auto&lt;/span&gt; root &lt;span style="color:#f92672"&gt;=&lt;/span&gt; toml&lt;span style="color:#f92672"&gt;::&lt;/span&gt;parse(&lt;span style="color:#e6db74"&gt;&amp;#34;config.toml&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 获取值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; toml&lt;span style="color:#f92672"&gt;::&lt;/span&gt;find&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(root, &lt;span style="color:#e6db74"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;cout &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Title: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; title &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="22-两种访问方式"&gt;2.2 两种访问方式&lt;/h3&gt;
&lt;p&gt;toml11 提供两种访问风格：&lt;/p&gt;</description></item><item><title>UtilsXX: 专为科学计算打造的 C++17 工具库</title><link>https://geowisdom.com.cn/posts/resource/utilsxx/readme_utilsxx/</link><pubDate>Sun, 10 May 2026 08:00:00 +0800</pubDate><guid>https://geowisdom.com.cn/posts/resource/utilsxx/readme_utilsxx/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;在科学计算和工程应用领域，C++ 开发者常常面临一个尴尬的局面：标准库提供了基础的数据结构和算法，但面对具体的科研需求——比如读取一个带注释的 CSV 文件、在终端显示一个进度条、解析复杂的配置文件、或者监控一个耗时数小时的计算进程——往往需要自行编写大量&amp;quot;胶水代码&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UtilsXX&lt;/strong&gt; 正是为解决这些痛点而生。它是一个基于 C++17 的轻量级工具库，专为地球科学、物理学和工程计算领域设计。不同于 Boost 这样的&amp;quot;全能型&amp;quot;库，UtilsXX 聚焦于科研工作者日常最高频的需求：数据处理、文件读写、终端交互、配置管理、时间计算和物理常数。本文将全面介绍 UtilsXX 的设计理念、核心模块和使用方法，帮助你快速上手并融入自己的项目。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一设计理念为什么创建-utilsxx"&gt;一、设计理念：为什么创建 UtilsXX？&lt;/h2&gt;
&lt;h3 id="11-科研编程的特殊需求"&gt;1.1 科研编程的特殊需求&lt;/h3&gt;
&lt;p&gt;科学计算程序与传统软件工程有显著不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据驱动&lt;/strong&gt;：大量时间花在读取、清洗、转换各种格式的数据上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长时运行&lt;/strong&gt;：数值模拟可能持续数小时甚至数天，需要进度反馈和交互控制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数密集&lt;/strong&gt;：算法通常有数十个可调参数，需要灵活的配置管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨平台协作&lt;/strong&gt;：代码需要在个人笔记本、工作站和超算集群上无缝运行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;快速迭代&lt;/strong&gt;：研究思路变化快，代码需要易于修改和扩展&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-utilsxx-的设计原则"&gt;1.2 UtilsXX 的设计原则&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;原则&lt;/th&gt;
&lt;th&gt;实践&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Header-Only 优先&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;大部分组件为单头文件，直接 &lt;code&gt;#include&lt;/code&gt; 即可使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;零依赖或内嵌依赖&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;核心模块无外部依赖；第三方库（如 nlohmann/json、toml11）直接内嵌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;类型安全&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;大量使用模板和 &lt;code&gt;static_assert&lt;/code&gt;，编译期捕获类型错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;异常友好&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;统一的 &lt;code&gt;error_handler&lt;/code&gt; 错误处理机制，提供清晰的错误信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;跨平台&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Windows、Linux、macOS 统一封装，终端操作透明适配&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;科研导向&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;内置地球物理常数、WGS84 参数、角度弧度转换等地学常用工具&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="13-与现有生态的关系"&gt;1.3 与现有生态的关系&lt;/h3&gt;
&lt;p&gt;UtilsXX 不是要取代谁，而是填补&amp;quot;标准库不够用、重型框架太重&amp;quot;之间的空白：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;vs 标准库&lt;/strong&gt;：补充了 CSV/JSON/TOML 解析、进度条、终端控制等缺失功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vs Boost&lt;/strong&gt;：更轻量、更聚焦，学习成本更低&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vs Python 生态&lt;/strong&gt;：让你在 C++ 中也能拥有类似 pandas（&lt;code&gt;dsv_table&lt;/code&gt;）、tqdm（&lt;code&gt;progress_bar&lt;/code&gt;）、argparse（&lt;code&gt;get_option&lt;/code&gt;/&lt;code&gt;CLI11&lt;/code&gt;）的体验&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二项目概览与快速开始"&gt;二、项目概览与快速开始&lt;/h2&gt;
&lt;h3 id="21-目录结构"&gt;2.1 目录结构&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;utilsxx/
├── lib/ # 核心头文件库
│ ├── vector.hpp # 向量类型与算法
│ ├── matrix.hpp # 轻量级矩阵
│ ├── dsv_table.hpp # 表格数据处理
│ ├── str_utils.hpp # 字符串工具
│ ├── file_utils.hpp # 文件操作
│ ├── get_option.hpp # 配置参数解析
│ ├── progress_bar.hpp # 终端进度条
│ ├── process_monitor.h # 进程监控
│ ├── utc_time.hpp # UTC 时间处理
│ ├── constants.hpp # 数学与物理常数
│ ├── term_utils.hpp # 终端控制
│ ├── json.hpp # JSON 解析（nlohmann/json）
│ ├── toml.hpp # TOML 解析（toml11）
│ ├── CLI11.hpp # 命令行解析（CLI11）
│ ├── indicators.hpp # 高级进度条（indicators）
│ ├── error_handler.hpp # 错误处理
│ └── src/ # 少量需要编译的源文件
│ └── process_monitor.cpp
├── demo/ # 示例程序
├── data/ # 示例数据文件
├── extra/ # 第三方库示例
├── CMakeLists.txt # CMake 构建配置
├── manager.sh # 便捷管理脚本
└── UtilsXXConfig.cmake.in # CMake 包配置模板
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="22-编译安装"&gt;2.2 编译安装&lt;/h3&gt;
&lt;p&gt;UtilsXX 使用 CMake 构建，支持作为子项目或直接安装到系统：&lt;/p&gt;</description></item><item><title>A large collection of Gnuplot examples</title><link>https://geowisdom.com.cn/posts/skills/a-collection-of-gnuplot-examples/</link><pubDate>Thu, 09 Jan 2025 00:00:00 +0000</pubDate><guid>https://geowisdom.com.cn/posts/skills/a-collection-of-gnuplot-examples/</guid><description>&lt;p&gt;I needed to use &lt;a href="http://www.gnuplot.info/"&gt;Gnuplot&lt;/a&gt; a little bit over the last few days, mostly to create 2D line charts, and these are my brief notes on how to get started with Gnuplot. If you haven’t used it before, it’s an &lt;em&gt;amazing&lt;/em&gt; tool for creating graphs and charts.&lt;/p&gt;
&lt;p&gt;Jumping right in &amp;hellip;&lt;/p&gt;
&lt;h2 id="installing-gnuplot"&gt;Installing gnuplot&lt;/h2&gt;
&lt;p&gt;To get started, you can use MacPorts or Homebrew to install Gnuplot on macOS systems:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;port install gnuplot
brew install gnuplot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that with Mac OS X Yosemite (10.10.x) running on an old Mac, I had to use this &lt;code&gt;brew&lt;/code&gt; command instead:&lt;/p&gt;</description></item><item><title>Pretty Plots with Gnuplot</title><link>https://geowisdom.com.cn/posts/skills/pretty-plots-with-gnuplot/</link><pubDate>Thu, 09 Jan 2025 00:00:00 +0000</pubDate><guid>https://geowisdom.com.cn/posts/skills/pretty-plots-with-gnuplot/</guid><description>&lt;p&gt;Given a data file that looks something like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;// f(GHz) S211(dB) S212(dB) S213(dB) S214(dB) S215(dB) S216(dB) S217(dB)
0.100E+00 -0.743E-03 0.586E-03 -0.390E-02 -0.787E-02 -0.930E-02 -0.159E-01 -0.164E-01
0.200E+00 -0.354E-02 -0.616E-02 -0.161E-01 -0.270E-01 -0.374E-01 -0.537E-01 -0.673E-01
0.300E+00 -0.820E-02 -0.174E-01 -0.364E-01 -0.589E-01 -0.843E-01 -0.117E+00 -0.152E+00
0.400E+00 -0.147E-01 -0.331E-01 -0.649E-01 -0.104E+00 -0.150E+00 -0.206E+00 -0.272E+00
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We want to make a plot. The X-axis of the plot is column 1 and the Y-axes are all the other columns. The software we&amp;rsquo;re going to use is &lt;a href="http://www.gnuplot.info/"&gt;gnuplot&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>重磁知识题库</title><link>https://geowisdom.com.cn/posts/resource/%E9%87%8D%E7%A3%81%E7%9F%A5%E8%AF%86%E9%A2%98%E5%BA%93/</link><pubDate>Tue, 31 Dec 2024 00:00:00 +0000</pubDate><guid>https://geowisdom.com.cn/posts/resource/%E9%87%8D%E7%A3%81%E7%9F%A5%E8%AF%86%E9%A2%98%E5%BA%93/</guid><description>&lt;h3 id="选择题"&gt;选择题&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;地磁场中占比最大的内源稳定场为____，它代表了地磁场空间分布的主要特征。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 大陆磁场&lt;/li&gt;
&lt;li&gt;B 中心偶极子场&lt;/li&gt;
&lt;li&gt;C 轴向地心偶极子场&lt;/li&gt;
&lt;li&gt;D 磁异常&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;磁赤道处，地下球体产生的△T异常在中心主剖面上的特征为____。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 轴对称曲线&lt;/li&gt;
&lt;li&gt;B 点对称曲线&lt;/li&gt;
&lt;li&gt;C 反对称曲线&lt;/li&gt;
&lt;li&gt;D 不对称曲线&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一个通过重心绕水平轴自由转动的磁针，令其水平轴垂直于磁子午面，磁针在磁赤道位置的静止状态为____。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 磁针S极向下&lt;/li&gt;
&lt;li&gt;B 磁针N极向下&lt;/li&gt;
&lt;li&gt;C 磁针水平&lt;/li&gt;
&lt;li&gt;D 磁针方向任意&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;质子磁力仪测量的读数值和经过各项校正计算所得的磁异常分别是指____。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A |$\vec{T}$|和 △T&lt;/li&gt;
&lt;li&gt;B |$\vec{T_a}$|和 △T&lt;/li&gt;
&lt;li&gt;C △T 和|$\vec{T_a}$|&lt;/li&gt;
&lt;li&gt;D |$\vec{T_a}$|和△Z&lt;/li&gt;
&lt;li&gt;E T|和Za&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;磁法勘探野外工作至少需要____以上仪器同时观测。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 1台&lt;/li&gt;
&lt;li&gt;B 2台&lt;/li&gt;
&lt;li&gt;C 3台&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在地球表面上任意一点的重力等于该点____。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 重力位的一阶导数&lt;/li&gt;
&lt;li&gt;B 重力位的梯度&lt;/li&gt;
&lt;li&gt;C 重力位&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;总强度磁异常ΔT是地磁场总强度矢量与正常地磁场矢量的____。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 矢量和&lt;/li&gt;
&lt;li&gt;B 矢量差&lt;/li&gt;
&lt;li&gt;C 模量差&lt;/li&gt;
&lt;li&gt;D 模量和&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;磁法勘探野外工作方法中，若仪器读数显示不正常（如正常磁场47500nT，显示10000nT左右），且noise大于10nT，则可能是下述哪种原因引起的____。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 探头方向不对&lt;/li&gt;
&lt;li&gt;B 探头接线处松动或断裂&lt;/li&gt;
&lt;li&gt;C 电源电压不足&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在地球表面上任意一点所受到的全部地球质量对它产生的引力方向是____。&lt;/p&gt;</description></item><item><title>使用GMT在平面图上绘制轨迹动画</title><link>https://geowisdom.com.cn/posts/skills/%E4%BD%BF%E7%94%A8gmt%E5%9C%A8%E5%B9%B3%E9%9D%A2%E5%9B%BE%E4%B8%8A%E7%BB%98%E5%88%B6%E8%BD%A8%E8%BF%B9%E5%8A%A8%E7%94%BB/</link><pubDate>Thu, 26 Dec 2024 14:00:00 +0000</pubDate><guid>https://geowisdom.com.cn/posts/skills/%E4%BD%BF%E7%94%A8gmt%E5%9C%A8%E5%B9%B3%E9%9D%A2%E5%9B%BE%E4%B8%8A%E7%BB%98%E5%88%B6%E8%BD%A8%E8%BF%B9%E5%8A%A8%E7%94%BB/</guid><description>利用GMT脚本在二维网格图像上绘制轨迹动画</description></item><item><title>LGD Momentum 算法测试</title><link>https://geowisdom.com.cn/posts/research/lgd_momentum/</link><pubDate>Thu, 26 Dec 2024 00:00:00 +0000</pubDate><guid>https://geowisdom.com.cn/posts/research/lgd_momentum/</guid><description>记录LGDM算法的设计与测试</description></item><item><title>一个简单的GMT动画例子</title><link>https://geowisdom.com.cn/posts/skills/%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84gmt%E5%8A%A8%E7%94%BB%E4%BE%8B%E5%AD%90/</link><pubDate>Wed, 25 Dec 2024 14:00:00 +0000</pubDate><guid>https://geowisdom.com.cn/posts/skills/%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84gmt%E5%8A%A8%E7%94%BB%E4%BE%8B%E5%AD%90/</guid><description>利用GMT脚本绘制sin函数动画</description></item><item><title>Visualising and plotting data with gnuplot</title><link>https://geowisdom.com.cn/posts/skills/visualising-and-plotting-data-with-gnuplot/</link><pubDate>Fri, 31 Mar 2023 00:00:00 +0000</pubDate><guid>https://geowisdom.com.cn/posts/skills/visualising-and-plotting-data-with-gnuplot/</guid><description>Introduction Data visualisation is extremely important for communicating the results of your research, either in a journal or to the general public, and for analysing and learning more about the characteristics of your data and system (so-called “exploratory data analysis”). One of the most fundamental tools in data visualisation is the two-dimensional plot (or graph). This tutorial will cover the basics of two-dimensional data visualisation using a program called gnuplot; a program which allows you to create high-quality, visually-pleasing figures and undertake robust post-hoc data analysis.</description></item><item><title>PLY格式介绍</title><link>https://geowisdom.com.cn/posts/skills/ply%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://geowisdom.com.cn/posts/skills/ply%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99/</guid><description>&lt;p&gt;PLY 格式是在 1990 年代由 Greg Turk 和斯坦福图形实验室的其他人开发的，这也是它被称为斯坦福三角格式的原因。自那时起，该文件格式一直保持 1.0 版本，没有进一步的修改。&lt;/p&gt;
&lt;h3 id="文件格式"&gt;文件格式&lt;/h3&gt;
&lt;p&gt;一个简单的 PLY 对象由一组用于表示对象的元素组成。它包含一个顶点列表（由(x,y,z)三元组组成）和一个面列表（实际上是顶点列表的索引）。顶点和面是两种元素的例子，而大多数 PLY 文件主要由这两种元素构成。此外，还可以创建新的属性并将其附加到对象的元素上，这些但属性应以一种不会破坏旧程序的方式添加，以便旧程序在遇到这些新属性时仍能正常运行。读取应用程序也可以忽略这些属性。此外，还可以创建新的元素，并为这些元素定义属性。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PLY 文件格式的文件结构如下：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;文件头&lt;/li&gt;
&lt;li&gt;顶点列表&lt;/li&gt;
&lt;li&gt;面列表&lt;/li&gt;
&lt;li&gt;其他元素的列表&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;示例结构&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在后续讨论中，我们将使用以下示例来说明 PLY 文件格式的各个部分。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-plaintext" data-lang="plaintext"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ply
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;format ascii 1.0 { ascii/binary，格式版本号 }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comment made by Greg Turk { 以 comment 关键字开头的注释 }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comment this file is a cube
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;element vertex 8 { 定义“顶点”元素，文件中有 8 个 }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;property float x { 顶点包含浮点数“x”坐标 }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;property float y { y 坐标也是顶点的属性 }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;property float z { z 坐标也是 }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;element face 6 { 文件中有 6 个“面”元素 }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;property list uchar int vertex_index { “vertex_indices” 是一个整数列表 }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;end_header { 标记头部的结束 }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0 0 0 { 顶点列表的开始 }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0 0 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0 1 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0 1 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1 0 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1 0 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1 1 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1 1 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4 0 1 2 3 { 面列表的开始 }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4 7 6 5 4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4 0 4 5 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4 1 5 6 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4 2 6 7 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4 3 7 4 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="文件头"&gt;文件头&lt;/h4&gt;
&lt;p&gt;PLY 文件格式的文件头由 ASCII 文本组成，无论是 ASCII 格式还是二进制格式都是如此。头部部分的开始和结束由&lt;code&gt;ply&lt;/code&gt;和&lt;code&gt;end_header&lt;/code&gt;关键字标识。头部的开始有一个魔术词&lt;code&gt;ply&lt;/code&gt;，用于让读取器识别 PLY 文件格式。下一行显示了该文件的版本号。PLY 文件格式中的注释以&lt;code&gt;comment&lt;/code&gt;关键字开头。&lt;/p&gt;</description></item></channel></rss>