C读取INI的代码实例

简介: 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;
}
目录
相关文章
|
小程序 前端开发 持续交付
小程序全栈开发中的CI/CD流程与自动化部署是一种高效的开发模式。
本文探讨小程序全栈开发中的CI/CD流程与自动化部署,介绍持续集成与部署的概念,包括自动化构建、测试、代码审查及部署实践。通过提高代码质量、迭代速度及团队协作效率,确保小程序稳定运行与良好用户体验。
326 2
|
人工智能 算法 调度
AIGC带来的挑战
【1月更文挑战第20天】AIGC带来的挑战
404 5
AIGC带来的挑战
|
网络协议 Linux 网络架构
Linux的网络配置
Linux的网络配置
220 0
|
机器学习/深度学习 数据采集 XML
使用BeautifulSoup解析豆瓣网站的HTML内容并查找图片链接
使用BeautifulSoup解析豆瓣网站的HTML内容并查找图片链接
|
Java 调度
多线程(初阶五:wait和notify)
多线程(初阶五:wait和notify)
136 0
【GraphVisual】画节点与线以及移动节点线随着移动
【GraphVisual】画节点与线以及移动节点线随着移动
|
数据挖掘 Linux
Linux系统struct input_event结构体分类型(鼠标、键盘、触屏)详解与例子
Linux系统struct input_event结构体分类型(鼠标、键盘、触屏)详解与例子
1893 0
Linux系统struct input_event结构体分类型(鼠标、键盘、触屏)详解与例子
|
XML JSON Java
腾讯T3-3级资深架构师呕心整理:10万字节springboot教程全解!
可以毫不夸张地说,这篇文章介绍的 SpringBoot 教程基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个springboot的用法,文中都会都会有详细的教程解释。
|
前端开发
前端学习案例2-高阶组件2
前端学习案例2-高阶组件2
165 0
前端学习案例2-高阶组件2
|
机器学习/深度学习 算法 JavaScript
数据结构与算法-1 :旋转图像
从本文开始,我将开启一个新的系列文章的编写数据结构与算法,在本系列文章中,我将对牛客、LeetCode等主流算法刷题平台的精彩题目进行讲解,实现语言包括Python(主)、Javascript、C、C++,同时我也会将相关算法与我们的实际开发项目结合,帮助大家更好的理解这略显枯燥的算法。
数据结构与算法-1 :旋转图像