MyLib
This commit is contained in:
70
Log/ConfigParser.cpp
Normal file
70
Log/ConfigParser.cpp
Normal file
@ -0,0 +1,70 @@
|
||||
#include "ConfigParser.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <cctype>
|
||||
|
||||
using namespace std;
|
||||
|
||||
/** 清理字符串前后空格 */
|
||||
void trim(std::string &s) {
|
||||
auto wsfront = std::find_if_not(s.begin(), s.end(), [](int c) {
|
||||
return std::isspace(c);
|
||||
});
|
||||
auto wsback = std::find_if_not(s.rbegin(), s.rend(), [](int c) {
|
||||
return std::isspace(c);
|
||||
}).base();
|
||||
s = (wsback <= wsfront) ? std::string() : std::string(wsfront, wsback);
|
||||
}
|
||||
|
||||
CPStatus configFromIni(const std::string &path, std::unordered_map<std::string, std::string> &config) {
|
||||
CPStatus result = CPSUCCESS;
|
||||
//打开文件
|
||||
ifstream file(path);
|
||||
if (!file.is_open()) {
|
||||
result = CPFILE;
|
||||
return result;
|
||||
}
|
||||
// 一次性读取整个文件(减少I/O操作)
|
||||
file.seekg(0, std::ios::end);
|
||||
size_t size = file.tellg();
|
||||
file.seekg(0, std::ios::beg);
|
||||
string m_buffer;
|
||||
m_buffer.resize(size);
|
||||
file.read(&m_buffer[0], static_cast<long long>(size));
|
||||
//处理全部数据
|
||||
config.clear();
|
||||
std::string line;
|
||||
line.reserve(256); // 预分配行缓存
|
||||
for (auto it = m_buffer.cbegin(); it != m_buffer.cend();) {
|
||||
// 快速跳过空白行
|
||||
while (it != m_buffer.cend() && (*it == '\r' || *it == '\n')) { ++it; }
|
||||
if (it == m_buffer.cend()) break;
|
||||
|
||||
// 获取行内容
|
||||
line.clear();
|
||||
while (it != m_buffer.cend() && *it != '\r' && *it != '\n' && *it != '\0') {
|
||||
line += *it++;
|
||||
}
|
||||
//处理行内容
|
||||
// 跳过空行和注释
|
||||
if (line.empty() || line[0] == ';' || line[0] == '#') {
|
||||
++it;
|
||||
continue;
|
||||
}
|
||||
|
||||
// 分割键值对
|
||||
size_t eq_pos = line.find('=');
|
||||
if (eq_pos != std::string::npos) {
|
||||
std::string key = line.substr(0, eq_pos);
|
||||
std::string value = line.substr(eq_pos + 1);
|
||||
trim(key);
|
||||
trim(value);
|
||||
if (!key.empty()) {
|
||||
config[key] = value; // 移动语义自动优化
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
Reference in New Issue
Block a user