C++读写INI文件
读操作不是原创
//INIPrase.h
#include <bits/stdc++.h>
using namespace std;
// 注释标记
#define COMMENT_CHAR ';'
class INIPrase {
public:
INIPrase();
~INIPrase();
///@details 读ini文件
///@param filename 文件名
///@param mContent 键值对
///@param section section名字
bool ReadConfig(const string &filename, map<string, string> &mContent, const char *section);
///@details 写ini文件,替换写
///@param filename 文件名
///@param mContent 键值对
///@param section section名字
bool WriteConfig(const string &filename, map<string, string> &mContent, const char *section);
///@details 输出键值对
///@param mContent 键值对
void PrintConfig(const map<string, string> &mContent);
private:
///@details 行处理,去除注释、判断格式等
///@param line 行信息
///@param key 关键字
///@param val 值
bool AnalyseLine(const string &line, string &key, string &val);
///@details 空格处理
void Trim(string &str);
///@details 是否为空格或者tab
bool IsSpace(char c);
};
//INIPrase.cpp
#include "INIPrase.h"
INIPrase::INIPrase() {}
INIPrase::~INIPrase() {}
bool INIPrase::ReadConfig(const string &filename, map<string, string> &mContent, const char *section) {
mContent.clear();
ifstream infile(filename.c_str());
if (!infile) {
return false;
}
string line, key, value;
int pos = 0;
string Tsection = string("[") + section + "]";
bool flag = false;
while (getline(infile, line)) {
if (!flag) {
pos = line.find(Tsection, 0);
if (-1 == pos) {
continue;
} else {
flag = true;
getline(infile, line);
}
}
if (0 < line.length() && '[' == line.at(0)) {
break;
}
if (0 < line.length() && AnalyseLine(line, key, value)) {
if (value.length() > 0) {
if (value[value.size() - 1] == '\r') {
value[value.size() - 1] = '\0';
}
}
mContent[key] = value;
}
}
infile.close();
if (pos == -1) {
return false;
}
return true;
}
bool INIPrase::AnalyseLine(const string &line, string &key, string &val) {
if (line.empty()) {
return false;
}
int start_pos = 0, end_pos = line.size() - 1, pos = 0;
if ((pos = line.find(COMMENT_CHAR)) != -1) {
if (0 == pos) {//行的第一个字符就是注释字符
return false;
}
end_pos = pos - 1;
}
string new_line = line.substr(start_pos, start_pos + 1 - end_pos); // 预处理,删除注释部分
if ((pos = new_line.find('=')) == -1) {
return false; // 没有=号
}
key = new_line.substr(0, pos);
val = new_line.substr(pos + 1, end_pos + 1 - (pos + 1));
Trim(key);
if (key.empty()) {
return false;
}
Trim(val);
return true;
}
void INIPrase::Trim(string &str) {
if (str.empty()) {
return;
}
unsigned int i, start_pos, end_pos;
for (i = 0; i < str.size(); ++i) {
if (!IsSpace(str[i])) {
break;
}
}
if (i == str.size()) { //全部是空白字符串
str = "";
return;
}
start_pos = i;
for (i = str.size() - 1; i >= 0; --i) {
if (!IsSpace(str[i])) {
break;
}
}
end_pos = i;
str = str.substr(start_pos, end_pos - start_pos + 1);
}
bool INIPrase::IsSpace(char c) {
if (' ' == c || '\t' == c) {
return true;
}
return false;
}
void INIPrase::PrintConfig(const map<string, string> &mContent) {
for (auto mite:mContent) {
cout << mite.first << "=" << mite.second << endl;
}
}
bool INIPrase::WriteConfig(const string &filename, map<string, string> &mContent, const char *section) {
ifstream infile(filename.c_str());
if (!infile) {
ofstream outfile(filename);
outfile.close();
cout << "[" << filename << "] 不存在,已创建!\n";
}
string line, key, value;
vector<string> strvec;
string Tsection = string("[") + section + "]";
while (getline(infile, line)) {
strvec.push_back(line);
}
infile.close();
regex section_r("\\[.*\\]");
regex target_section_r("\\[(\\b" + string(section) + "\\b)\\]");
for (vector<string>::iterator it = strvec.begin(); it != strvec.end(); it++) {
if (regex_match(*it, target_section_r)) {
it = strvec.erase(it);
while (it != strvec.end() && !regex_match(*it, section_r)) {
it = strvec.erase(it);
}
break;
}
}
ofstream outfile(filename);
for(auto vec:strvec) {
outfile << vec << "\n";
}
outfile << "[" + string(section) + "]\n";
for (auto mc:mContent) {
outfile << mc.first + "=" + mc.second + "\n";
}
outfile.close();
}