【C++】关于通过读取一个.ini文件来初始化配置信息,如何实现?

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”类可以解决你的问题。

/*==========================================================

  • Function : readConfig
  • Description: 读取配置文件的信息,以map的形式存入
  • attention : 配置文件的格式,以#作为行注释,配置的形式是key = value,中间可有空格,也可没有空格
  • Input : const string & filename 配置文件名称
  • map & m 待存入数据的map
  • Return : bool 读取是否成功 ==========================================================*/ #define COMMENT_CHAR '#' bool readConfig(const string & filename, map & m);

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;

}
/*==========================================================

  • Function : isnull
  • Description: 验证字符串是否为空
  • Input : const char *d_str 输入字符串
  • Output :
  • Return : 1 字符串为空
  •     0    字符串不为空
    

    ==========================================================*/
    int YAux::isnull(const char *d_str)
    {
    if (d_str == NULL || d_str[0] == '\0')
    return(1);

    return(0);
    }

/*==========================================================

  • Function : trim
  • Description:滤去字符串的前后空格,与Oracle的Trim函数功能类似
  • Input : char *str
  • Output : char *str
  • 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;

}