您的C++——不仅仅是游戏和驱动程序
\n\n当听到“C++”时,人们常常想到重型武器:Unreal引擎、操作系统、高负载服务器。但还有另一个同样有用的方面——用C++实现任务自动化。当同事们编写一次性Bash脚本或为Python依赖而苦恼时,您可以构建一个紧凑、快速的实用工具,它能在无需更新解释器的情况下稳定运行多年。
\n\n在本文中,我将展示如何将C++变成自动化的瑞士军刀。我们将分析真实案例:从批量重命名文件到日志解析和报告生成。您将看到,用C++实现日常自动化并不复杂,而且在速度和可靠性方面非常划算。
\n\n为什么选择C++,而不是Python或Bash?
\n\n每种语言都有其用武之地。但在某些场景下,C++更具优势:
\n\n- \n
- 执行速度。 如果您处理的是TB级别的日志——每一毫秒都至关重要。 \n
- 无依赖。 一个静态编译的二进制文件可在任何Linux/Windows上运行,无需安装解释器。 \n
- 类型安全。 运行时意外更少——对于按计划运行的自动化任务至关重要。 \n
- 系统访问。 直接操作WinAPI、POSIX、注册表、进程——无需中间层。 \n
当然,对于快速原型开发,Python更方便。但当脚本成为CI/CD或生产基础设施的一部分时,用C++实现自动化会带来百倍回报。
\n\n工具集:需要了解什么
\n\n对于我们的任务,不需要完整的C++20。掌握基础就足够了:
\n\n- \n
std::filesystem(C++17) — 文件和文件夹操作 \nstd::regex— 文本解析 \nstd::fstream/std::stringstream— 读写操作 \nstd::chrono— 时间测量和日志记录 \n
编译时使用 -std=c++17 标志(对于MSVC使用 /std:c++17)。
示例1:批量重命名文件
\n\n假设您有一个包含照片的文件夹 IMG_001.jpg、IMG_002.jpg……需要将它们重命名为 2025_01_15_001.jpg 格式。手动操作——10分钟枯燥的工作。用脚本——0.2秒。
代码
\n#include <iostream>\n#include <filesystem>\n#include <regex>\n#include <string>\n\nnamespace fs = std::filesystem;\n\nint main() {\n std::string dir_path = "./photos";\n std::regex pattern(R"(IMG_(\\d+)\\.jpg)");\n std::string prefix = "2025_01_15_";\n\n for (auto &entry : fs::directory_iterator(dir_path)) {\n std::string filename = entry.path().filename().string();\n std::smatch match;\n\n if (std::regex_match(filename, match, pattern)) {\n std::string new_name = prefix + match[1].str() + ".jpg";\n fs::rename(entry.path(), entry.path().parent_path() / new_name);\n std::cout << "Renamed: " << filename << " -> " << new_name << "\\n";\n }\n }\n return 0;\n}\n\n这个示例展示了如何通过用C++实现任务自动化,借助 std::filesystem 和正则表达式,用几行代码解决日常问题。您可以轻松地将其适配到自己的模式。
示例2:日志解析和错误计数
\n\n假设服务器以如下格式写入日志:
\n2025-01-15 10:23:45 [ERROR] Database connection failed\n2025-01-15 10:23:46 [INFO] Retry #1\n2025-01-15 10:23:47 [ERROR] Timeout exceeded\n\n我们需要收集统计信息:每种类型的错误数量,并输出出现频率最高的前5条消息。Bash单行命令可以处理,但如果日志有GB级别——C++会快得多。
\n\n代码
\n#inc