Files
python/LuoGu/RepairCMakeLists.cpp
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

151 lines
3.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <bits/stdc++.h>
#include <io.h>
using namespace std;
/**
* 功能:获取指定目录下所有的文件
* 作者:黄海
* 时间2019-12-04
* @param cate_dir
* @return
*/
void getFiles(const string &path, vector<std::string> &files) {
//文件句柄
intptr_t hFile = 0;
//文件信息_finddata_t需要io.h头文件
struct _finddata_t fileinfo;
std::string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
do {
//如果是目录,迭代之
//如果不是,加入列表
if ((fileinfo.attrib & _A_SUBDIR)) {
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
} else {
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
int startsWith(string s, string sub) {
return s.find(sub) == 0 ? 1 : 0;
}
int endsWith(string s, string sub) {
return s.rfind(sub) == (s.length() - sub.length()) ? 1 : 0;
}
/**
* 功能:替换指定字符串
* 作者:黄海
* 时间2019-11-21
* @param str
* @param old_value
* @param new_value
* @return
*/
string &replace_all(string &str, const string &old_value, const string &new_value) {
while (true) {
string::size_type pos(0);
if ((pos = str.find(old_value)) != string::npos)
str.replace(pos, old_value.length(), new_value);
else break;
}
return str;
}
/**
* 功能:将字符串进行分隔的工具函数
* 作者:黄海
* 时间2019-12-04
* @param s
* @param sv
* @param flag
*/
void split(const string &s, vector<string> &sv, const char flag = ' ') {
sv.clear();
istringstream iss(s);
string temp;
while (getline(iss, temp, flag)) {
sv.push_back(temp);
}
return;
}
/**
* 功能获取当前exe执行文件的上一级目录
* 作者:黄海
* 时间2019-12-04
* @return
*/
string getCurrentParentPath() {
//当前目录
char currentPath[256];
_getcwd(currentPath, sizeof(currentPath));
vector<string> pathVector;
split(string(currentPath), pathVector, '\\');
string parentPath = "";
for (int i = 0; i < pathVector.size() - 1; i++) {
parentPath += pathVector[i] + "\\";
}
//去掉最后的分隔符
parentPath = parentPath.substr(0, parentPath.size() - 1);
return parentPath;
}
string inFile = "../../CMakeLists.config";
string configFile = "../CMakeLists.txt";
int main() {
//获取当前目录的上一级目录
string path = getCurrentParentPath();
//中文?
locale loc = locale::global(locale(locale(), "", LC_CTYPE));
//输入文件
ifstream in;
in.open(inFile);
//输出文件
ofstream out;
out.open(configFile);
//遍历
string line;
while (getline(in, line)) {
string str = line;
out << str << endl;
}
//开始处理目录下的所有CPP文件
vector<string> filenames;//用来存储文件名
getFiles(path, filenames);
int count = 0;
for (auto file : filenames) {
if (endsWith(file, ".cpp") && !endsWith(file, "CMakeCXXCompilerId.cpp")) {
string key = replace_all(file, path, "").substr(1);
key = replace_all(key, "\\", "/");
//获取程序名称
vector<string> sv;
split(key, sv, '/');
string fName;
if (sv.size() > 1)fName = sv[1]; else fName = sv[0];
fName = replace_all(fName, ".cpp", "");
out << "add_executable(" + fName + " " + key + ")" << endl;
count++;
}
}
//关闭文件
out.close();
in.close();
cout << "恭喜,配置文件修改成功完成,成功添加.cpp文件共" << count << "个!" << endl;
return 0;
}