linux环境,想通过C++代码实现读取和过滤.ini配置信息,信息格式如:flag=true,
还有一问:代码中通常将log信息通过宏封装起来,那么如何通过读取的信息来控制它呢?
http://www.cnblogs.com/it-duit/p/5632547.html
linux环境是没有ini专用的api的。需要自己写程序模拟一个,其实自己写一个也很简单的,思路代码如下:
char line[10240];
FILE* fp = fopen("xxx.ini", "rt");
while((fgets(line)) != NULL)
{
// 将line末尾的\r\n去掉,并去掉起头的空格
代码略
// 如果第一个字符是'[',则作为标题栏目
if(line[0] == '[')
{
// 切分出标题名,代码略
const char* sp = substring(line + 1, line.Length - 2)
... 后续处理
}
// 如果是注释行则跳过
else if(line[0] == ';')
{
}
else
{
// 搜索第一个'='
char* p = strchr(line, '=');
// 如果找到则为内容行
if(p != NULL)
{
*p ++;
char* key = line;
char* value = p;
... 后续处理
}
}
}
fclose(fp);
如果你使用QT进行编程的话,里面有一个“QSettings”类可以解决你的问题。
/*==========================================================
using namespace std;
bool IsSpace(char c)
{
if (' ' == c || '\t' == c)
return true;
return false;
}
bool IsCommentChar(char c)
{
switch(c) {
case COMMENT_CHAR:
return true;
default:
return false;
}
}
int YAux::strstr(const char * src,const char *substr)
{
// char *s_tmp;
if (YAux::isnull(src) || YAux::isnull(substr))
return -1;
// 20161027 这样处理是因为高版本的编译器不能将const char*遍历赋给char *变量
const char *s_tmp = ::strstr(src,substr);
// s_tmp = strstr(src,substr);
if (YAux::isnull(s_tmp))
return -1;
return s_tmp-src+1;
}
/*==========================================================
0 字符串不为空
==========================================================*/
int YAux::isnull(const char *d_str)
{
if (d_str == NULL || d_str[0] == '\0')
return(1);
return(0);
}
/*==========================================================
Return : char str
==========================================================/
char *YAux::trim(char *str )
{
int len = 0;
int i = 0;
if (isnull(str) == 1)
return str;
len = strlen(str);
while((str[len-1] == ' ') && (len >0))
len--;
str[len] = '\0';
while(str[i] == ' ')
i++;
if(i > 0)
{
//for( j=0; j<len-i+1 ; j++ )
// str[j] = str[j+i];
memmove(str,str + i,len - i + 1);
}
return str;
}
void YAux::trim(string & str)
{
if (str.empty()) {
return;
}
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 AnalyseLine(const string & line, string & key, string & value)
{
if (line.empty())
return false;
int start_pos = 0, end_pos = line.size() - 1, pos;
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);
value = new_line.substr(pos + 1, end_pos + 1- (pos + 1));
YAux::trim(key);
if (key.empty()) {
return false;
}
YAux::trim(value);
return true;
}
bool YAux::readConfig(const string & filename, map & m)
{
m.clear();
ifstream infile(filename.c_str());
if (!infile) {
cout << "file open error" << endl;
return false;
}
string line, key, value;
while (getline(infile, line)) {
if (AnalyseLine(line, key, value)) {
m[key] = value;
}
}
infile.close();
return true;
}