C读取INI的代码实例

工作需要,网上找了一点代码,以此为基础做了修改。写的部分还没做,以后有机会再发布。

从方便来看,最好是实现一个字典,把值放进字典中,访问起来特别方便。

/**
  允许section为空,此时搜索文件的全部。
 */
int gh_conf_read_value(const char* psFile, const char* psSection, const char* psKey, char* psValue)
{
    FILE* pFile = NULL;
    char lineContent[LINE_CONTENT_MAX_LEN];
    BOOL bFoundSection = BOOL_FALSE;
    BOOL bFoundKey     = BOOL_FALSE;
    char cHead         = 0;
    int  nLength       = 0;
    char *pHead        = NULL;
 
    if (psKey == NULL || psFile == NULL || psValue == NULL)
    {
        return -1;
    }
 
    pFile = fopen(psFile, "r");
    if (pFile == NULL)
    {
        GH_LOG_INFO("%s: Opent file %s failed.\n", __FILE__, psFile);
        return -1;
    }
 
    //找到sestion
    if (psSection != NULL)
    {
        while (feof(pFile) == 0)
        {
            memset(lineContent, 0, LINE_CONTENT_MAX_LEN);
            fgets(lineContent, LINE_CONTENT_MAX_LEN, pFile);
            cHead   = lineContent[0];
 
            //去空格
            if ((cHead == '#') || (cHead == '\0') || (cHead == '\r') || (cHead == '\n'))
            {
                continue;
            }
 
            //合法的section, 自动认为 lineContent[nLength-1-1] == ']'
            if (cHead == '[')
            {
                //[]之外,还有个\n
                nLength = strlen(lineContent)-3;
                if (!strncmp(lineContent+1, psSection, nLength))
                {
                    bFoundSection = BOOL_TRUE;
                    break;
                }
                continue;
            }
        }
 
        //没找到,直接返回吧。
        if (!bFoundSection)
        {
            fclose(pFile);
            return -1;
        }
    }
 
    //找KEY
    while (feof(pFile) == 0)
    {
        memset(lineContent, 0, LINE_CONTENT_MAX_LEN);
        fgets(lineContent, LINE_CONTENT_MAX_LEN, pFile);
        cHead = lineContent[0];
 
        if ((cHead == '#') || (cHead == '\0') || (cHead == '\r') || (cHead == '\n'))
        {
            continue;
        }
 
        //碰到新的节,要说明没找到。
        if (psSection != NULL && cHead == '[')
        {
            break;
        }
 
        //check key
        if (strncmp(lineContent, psKey, strlen(psKey)) == 0)
        {
            bFoundKey = BOOL_TRUE;
            break;
        }
    }
 
    //先关闭,后面省事。
    fclose(pFile);
    pFile = NULL;
 
    //没找到,直接返回吧。
    if (!bFoundKey)
    {
        return -1;
    }
 
    //切分值。从第一个等号开始,后面全部是值。
    pHead = strchr(lineContent, '=');
    if (pHead == NULL)
    {
        return -1;
    }
 
    //跳过=
    pHead++;
    nLength = strlen(pHead)-1;
    //最后一个是回车
    if (pHead[nLength] == '\n')
    {
        pHead[nLength] = 0;
    } 
    strcpy(psValue, pHead);
 
    return 0;
}
上一篇:同一个ASP.NET页面放置多个UpdatePanel分别刷新的解决办法。.


下一篇:.NET Compact Framework 多线程环境下的UI异步刷新