Votre C++ ne sert pas qu'aux jeux et aux pilotes
\n\nQuand on entend « C++ », on pense souvent à de l'artillerie lourde : moteurs Unreal, systèmes d'exploitation, serveurs à haute charge. Mais il y a un autre côté, tout aussi utile : l'automatisation des tâches en C++. Pendant que vos collègues écrivent des scripts Bash jetables ou galèrent avec les dépendances Python, vous pouvez créer un utilitaire compact, rapide, qui fonctionnera pendant des années sans mise à jour d'interpréteur.
\n\nDans cet article, je vais vous montrer comment faire du C++ un couteau suisse pour l'automatisation. Nous verrons des exemples concrets : du renommage par lots de fichiers au parsing de logs et à la génération de rapports. Vous verrez que l'automatisation des tâches répétitives en C++ n'est pas compliquée, mais très rentable en termes de vitesse et de fiabilité.
\n\nPourquoi C++ plutôt que Python ou Bash ?
\n\nChaque langage a sa place. Mais il y a des scénarios où C++ fait la différence :
\n\n- \n
- Vitesse d'exécution. Si vous traitez des téraoctets de logs, chaque milliseconde compte. \n
- Absence de dépendances. Un binaire compilé statiquement fonctionne sur n'importe quel Linux/Windows sans installer d'interpréteur. \n
- Sécurité des types. Moins de surprises à l'exécution, crucial pour une automatisation lancée en tâche planifiée. \n
- Accès système. Travail direct avec WinAPI, POSIX, le registre, les processus, sans couches intermédiaires. \n
Bien sûr, pour un prototype rapide, Python est plus pratique. Mais quand le script devient partie intégrante du CI/CD ou de l'infrastructure de production, l'automatisation en C++ est largement rentabilisée.
\n\nOutils : ce qu'il faut savoir
\n\nPour nos tâches, pas besoin de tout C++20. Un ensemble de base suffit :
\n\n- \n
std::filesystem(C++17) — gestion des fichiers et dossiers \nstd::regex— parsing de texte \nstd::fstream/std::stringstream— lecture/écriture \nstd::chrono— mesures de temps et logging \n
Compilez avec le flag -std=c++17 (ou /std:c++17 pour MSVC).
Exemple 1 : Renommage par lots de fichiers
\n\nImaginez : vous avez un dossier de photos IMG_001.jpg, IMG_002.jpg … Vous devez les renommer au format 2025_01_15_001.jpg. À la main, c'est 10 minutes de travail fastidieux. Avec un script, 0,2 seconde.
Code
\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\nCet exemple montre comment l'automatisation des tâches en C++ avec std::filesystem et les expressions régulières résout un problème quotidien en quelques lignes. Vous pouvez facilement l'adapter à vos propres motifs.
Exemple 2 : Parsing de logs et comptage d'erreurs
\n\nSupposons que votre serveur écrive des logs au format :
\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\nNous devons collecter des statistiques : combien d'erreurs de chaque type, et afficher le top 5 des messages les plus fréquents. Une ligne de commande Bash peut le faire, mais si les logs pèsent des gigaoctets, C++ sera bien plus rapide.
\n\nCode
\n#inc