C语言读取写入ini配置文件的方法实现

yizhihongxing

以下是关于C语言读取写入ini配置文件的方法实现的攻略。

什么是INI配置文件

INI配置文件是一种文本文件,用于保存程序使用的配置信息。INI文件的结构是基于Sections和Key/Value的键值对。

一个典型的INI文件包含多个Sections,而一个Section可以包含多个Key/Value键值对。如:

[Section1]
key1=value1
key2=value2

[Section2]
key3=value3
key4=value4

C语言读取INI文件

要读取INI文件,我们需要使用C语言的标准库函数fopen、fgets、sscanf等函数库。

以下是一个基本的INI文件读取函数示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUF_SIZE 256

/* 读取key对应的value */
char *iniReadString(char *fileName, char *sectionName, char *keyName, char *defaultValue) 
{
    char buf[BUF_SIZE];
    char *value = NULL;
    FILE *fp;
    int inSection = 0;
    int len;
    char sectionHead[BUF_SIZE];
    char *pos;

    /* 打开INI文件 */
    if ((fp = fopen(fileName, "r")) == NULL) 
    {
        return strdup(defaultValue); /* 如果文件不存在,返回默认值 */
    }

    len  = strlen(keyName);
    while (fgets(buf, BUF_SIZE - 1, fp) != NULL) 
    {
        /* 如果是section */
        if (buf[0] == '[') 
        {
            pos = strchr(buf, ']');
            if (pos == NULL) continue;
            *pos = 0;
            strcpy(sectionHead, buf + 1);
            inSection = !strcmp(sectionHead, sectionName);
            continue;
        }

        /* 如果不在section内,则继续寻找 */
        if (inSection == 0) 
        {
            continue;
        }

        /* 如果是key/value对 */
        pos = strchr(buf, '=');
        if (pos == NULL) 
        {
            continue;
        }

        *pos = 0;
        if (strncmp(keyName, buf, len) == 0) 
        {
            /* 找到了key对应的value */
            value = strdup(pos + 1);
            break;
        }
    }

    fclose(fp);

    if (value == NULL) 
    {
        /* 没有找到key对应的value,则返回默认值 */
        return strdup(defaultValue);
    }

    /* 去掉value中的空白字符 */
    len = strlen(value);
    while (len > 0 && isspace(value[len - 1])) 
    {
        value[--len] = 0;
    }

    return value;
}

该函数需要传入ini文件名、section名、key名和默认值,如果读取失败,则返回默认值。

C语言写入INI文件

要写入INI文件,我们同样需要使用C语言的标准库函数fopen、fprintf等函数库。

以下是一个基本的INI文件写入函数示例:

int iniWriteString(char *fileName, char *sectionName, char *keyName, char *value)
{
    FILE *fp;
    char buf[BUF_SIZE];
    char sectionHead[BUF_SIZE];
    char *pos;

    /* 打开INI文件 */
    if ((fp = fopen(fileName, "r+")) == NULL) 
    {
        return -1; /* 如果文件不存在,则返回失败 */
    }

    /* 搜索对应的section */
    sprintf(sectionHead, "[%s]", sectionName);
    while (fgets(buf, BUF_SIZE - 1, fp) != NULL) 
    {
        if (strncmp(sectionHead, buf, strlen(sectionHead)) == 0) 
        {
            /* 找到对应的section,搜索对应的key */
            while (fgets(buf, BUF_SIZE - 1, fp) != NULL) 
            {
                pos = strchr(buf, '=');
                if (pos == NULL) 
                {
                    continue;
                }

                *pos = 0;
                if (strcmp(keyName, buf) == 0) 
                {
                    /* 找到对应的key,写入新的value */
                    fseek(fp, -strlen(buf), SEEK_CUR);
                    fprintf(fp, "%s=%s\n", keyName, value);
                    fclose(fp);
                    return 0;
                }
            }

            /* 没有找到对应的key,则在section末尾添加新的key/value */
            fseek(fp, 0, SEEK_END);
            fprintf(fp, "\n%s=%s\n", keyName, value);
            fclose(fp);
            return 0;
        }
    }

    /* 没有找到对应的section,则在文件末尾添加新的section/key/value */
    fseek(fp, 0, SEEK_END);
    fprintf(fp, "\n[%s]\n", sectionName);
    fprintf(fp, "%s=%s\n", keyName, value);
    fclose(fp);

    return 0;
}

该函数需要传入ini文件名、section名、key名和要写入的value,如果写入成功,则返回0。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言读取写入ini配置文件的方法实现 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • jquery经典面试题及答案精选

    以下是“jQuery经典面试题及答案精选的完整攻略”的标准markdown格式文本,其中包含两个示例: jQuery经典面试题及答案精选 在前端开发中,jQuery是一款非常流行的JavaScript库,常常被用来操作DOM、处理事件、实现动画等。以下是一些经典的jQuery面试题及答案精选。 1. 如何使用jQuery选择器选中一个元素? 使用jQuery…

    other 2023年5月10日
    00
  • tomcat的热部署配置

    以下是详细讲解“Tomcat的热部署配置的完整攻略”,过程中至少包含两条示例说明的标准Markdown格式文本: Tomcat的热部署配置的完整攻略 Tomcat是常用的Java Web应用服务器,支持热部署功能,可以在不重启服务器的情况下更新应用程序。本文将介绍如配置Tomcat的热部署功能,包括使用Tomcat Manager和使用JRebel插件。 使…

    other 2023年5月10日
    00
  • 详解C语言中的指针与数组的定义与使用

    详解C语言中的指针与数组的定义与使用 1. 指针的定义与使用 指针是C语言中一种非常重要的数据类型,它存储了一个变量的内存地址。通过指针,我们可以直接访问和修改变量的值,还可以动态地分配和释放内存。 1.1 指针的定义 在C语言中,我们可以使用*符号来声明一个指针变量。例如,下面的代码声明了一个指向整数的指针变量: int *ptr; 1.2 指针的初始化 …

    other 2023年8月2日
    00
  • oraclein函数

    以下是关于“Oracle IN函数”的完整攻略,包括基本概念、语法、示例说明和注意事项。 基本概念 Oracle IN函数是一种用于查询数据的函数,它可以用于查询某个字段是否在一个给定的值列表中。IN函数可以接受多个参数,每个参数之间用逗号分隔。如果查询字段值在给定的值列表中,则返回TRUE,否则返回FALSE。 语法 IN函数的语法如下: SELECT c…

    other 2023年5月7日
    00
  • 在 linux 的命令行输出进度条

    要在 Linux 命令行实现输出进度条可以使用 pv 命令,下面是实现的具体步骤和示例。 步骤1:安装 pv 命令 在大多数 Linux 发行版中,可以通过包管理器直接安装 pv 命令。例如,在 Debian/Ubuntu 下可以使用以下命令安装: sudo apt-get install pv 如果你使用的是其他发行版,可以使用相应的包管理器安装 pv。 …

    other 2023年6月26日
    00
  • PowerShell中使用Get-ChildItem命令读取目录、文件列表使用例子和小技巧

    PowerShell中使用Get-ChildItem命令读取目录、文件列表使用例子和小技巧 PowerShell是一种功能强大的脚本语言和命令行工具,可以用于管理和自动化Windows操作系统。Get-ChildItem是PowerShell中常用的命令之一,用于获取指定目录下的文件和子目录列表。下面是关于如何使用Get-ChildItem命令的详细攻略。 …

    other 2023年8月6日
    00
  • javascript之es6

    JavaScript之ES6的完整攻略 ES6是JavaScript的一个重要版本,引入了许多新的语言特性和功能,使得JavaScript更加强大和易于使用。本文将介绍ES6的主要特性和功能,并提供两个示例说明,以帮您更好地了解应用这些技术。 ES6的主要特性和功能 let和const关键字 ES6引入了和const关键字,用于声明变量和常量。与var关键字…

    other 2023年5月7日
    00
  • Spring Bean创建和循环依赖

    Spring Bean创建和循环依赖的完整攻略 Spring框架提供了强大的依赖注入功能,可以通过配置文件或注解来创建和管理Bean。在某些情况下,可能会出现循环依赖的情况,即两个或多个Bean之间相互依赖,导致无法正常创建Bean的问题。以下是解决Spring Bean创建和循环依赖的完整攻略: 构造器注入:使用构造器注入可以解决循环依赖的问题。通过在构造…

    other 2023年10月15日
    00
合作推广
合作推广
分享本页
返回顶部