在Linux中实现类似windows中获取配置文件的函数GetProfileString。在读取配置文件时,window环境下,有GetProfileString函数,而Linux下则没有。网上找了⼀个能
实现其功能的函数,原理很简单。如下所示,基本思想是捉住配置文件中用“[]”标记的段没有“=”,而非“[]”段有“=”这⼀特征,先找section段,再找键,得到对应的值。
配置文件示例
[section1]
age = 12
name = Wang
[section2]
age = 13
name = Zhang
#include "cstdio"
#include "iostream"
#include "string"
#include "fstream"
using namespace std;
int GetProfileString(string file_name, string section_name, string item_name,
string &item_value)
{
ifstream mystream ;
mystream.open(file_name.c_str(), ios::in);
if (!mystream)
{
cout << "Error " << endl;
return -1;
}
char line[30] = {0};
string line2;
string::size_type return_of_find;
bool found = false;
while (mystream.getline(line, 30) && !found) //默认行不会超过30个字符
{
line2 = line;
return_of_find = line2.find(section_name);
if (string::npos == return_of_find)
continue; //没找到section项,则继续下⼀行读取
//找到了,则执行第二步,寻找相应的键值,关键是不能跨越多段
while (mystream.getline(line, 30) && !found)
{
line2 = line;
string equal_flag = "=";
return_of_find = line2.find(equal_flag);
if (string::npos == return_of_find)
return -1;//说明已经跨越了多段,目标寻找失败
//还在当前段中
return_of_find = line2.find(item_name);
if (string::npos == return_of_find)
continue; //没有找到
//找到了
return_of_find = line2.rfind(" "); //要求配置文件=两边要有空格
item_value = line2.substr(return_of_find + 1); //该行最后一个空格之后开始的为所要的item_value
found = true;
}
}
mystream.close();
return 0;
}
自己加了写配置文件的函数,原理差不多, 找到相应的键值进行替换,在移动文件指针,将修改后值写入。
int SetProfileString(string file_name, string section_name, string item_name,
string &item_value)
{
fstream mystream ;
mystream.open(file_name.c_str());
if (!mystream)
{
cout << "Error " << endl;
return -1;
}
char line[30] = {0};
string line2;
string::size_type return_of_find;
bool found = false;
while (mystream.getline(line, 30) && !found) //默认行不会超过30个字符
{
line2 = line;
return_of_find = line2.find(section_name);
if (string::npos == return_of_find)
continue; //没找到section项,则继续下⼀行读取
//找到了,则执行第二步,寻找相应的键值,关键是不能跨越多段
while (mystream.getline(line, 30) && !found)
{
line2 = line;
string equal_flag = "=";
return_of_find = line2.find(equal_flag);
if (string::npos == return_of_find)
return -1;//说明已经跨越了多段,目标寻找失败
//还在当前段中
return_of_find = line2.find(item_name);
if (string::npos == return_of_find)
continue; //没有找到
//找到了
return_of_find = line2.rfind(" "); //要求配置文件=两边要有空格
//item_value = line2.substr(return_of_find + 1); //该行最后一个空格之后开始的为所要的item_value
line2.replace(return_of_find+1, item_value.size(), item_value);
//mystream<<line2.c_str();
int len = line2.size();
mystream.seekp(-(len), ios::cur); //移动文件指针
mystream<<line2<<"\n";
found = true;
}
}
mystream.close();
return 0;
}