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

以下是关于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日

相关文章

  • CAD怎么自定义设置shx字?

    下面是关于CAD如何自定义设置shx字的攻略。具体操作步骤如下: 步骤一:准备shx字体文件 在CAD中,默认提供了一些shx字体文件供用户选择使用,但是如果你需要使用自己的shx字体文件,就需要先将字体文件准备好。 安装字体文件 如果你已经有了自己的shx字体文件,就需要将它安装到系统中。在Windows系统中,只需要双击字体文件即可安装。具体操作步骤如下…

    other 2023年6月25日
    00
  • 深入剖析Java ArrayQueue(JDK)的源码

    以下是“深入剖析Java ArrayQueue(JDK)的源码”的完整攻略及示例说明: 深入剖析Java ArrayQueue(JDK)的源码 一、背景介绍 Java ArrayQueue是Java中的一个数据结构,在JDK中有其源码实现,供我们参考。因此,深入剖析Java ArrayQueue源码对我们理解该数据结构的工作原理,以及Java中的数据结构实现…

    other 2023年6月26日
    00
  • Android编程自定义组件实例详解

    Android编程自定义组件实例详解 什么是自定义组件 自定义组件是指在 Android 中自己定义一个组件(View),并通过布局文件或代码使用这个组件,它不同于系统提供的常用组件,例如Button、TextView等。自定义组件可以根据需求自由定义功能和样式,扩展系统组件无法完成的功能。 自定义View的步骤 自定义View的基本步骤如下: 继承系统提供…

    other 2023年6月27日
    00
  • ios沙盒简单介绍

    以下是详细讲解“iOS沙盒简单介绍的完整攻略”的标准Markdown格式文本: iOS沙盒简单介绍的完整攻略 在iOS开发中,沙盒是指应用程序运行时的一个封闭环境,应用程序只能该环境中进行文件读写操作。本文将介绍iOS沙盒的简单介绍,包括沙盒的基本概念、沙盒的录结构和沙盒的使用方法,同时提供两个示例说明。 1. 沙盒的基本概念 沙盒是指应用程序运行时的一个封…

    other 2023年5月9日
    00
  • Windows Server 2008搭建终端服务器

    Windows Server 2008搭建终端服务器完整攻略 1. 安装远程桌面服务 首先,需要安装远程桌面服务。可以通过以下步骤来实现: 打开”服务器管理器”,选择”角色”,然后选择”添加角色”。 在出现的向导中,选择”远程桌面服务”,然后按照提示进行安装。 2. 配置终端服务 在安装完远程桌面服务后,需要进行终端服务的配置。可以通过以下步骤来实现: 打开…

    other 2023年6月27日
    00
  • smartisan os1.3官网下载地址 smartisan os1.3详细下载地址

    很抱歉,但我无法提供关于特定软件版本的下载地址。然而,我可以为您提供一般的下载指南,以帮助您找到Smartisan OS 1.3的官方下载地址。 首先,您可以访问Smartisan官方网站。通常,软件的官方网站会提供最新版本的下载链接。您可以使用任何现代网络浏览器,如Chrome、Firefox或Safari,打开您的首选搜索引擎,搜索Smartisan官方…

    other 2023年8月4日
    00
  • navicatpremium12安装及激活

    以下是关于“navicat premium 12安装及激活”的完整攻略,包括基本概念、使用方法和两个示例。 基本概念 Navicat Premium 12是一款功能强大的数据库管理工具,支持多种数据库类型,包括MySQL、MariaDB、Oracle、SQL、PostgreSQL等。安装和激活Navicat Premium 12需要一定的操作步骤,本攻略将为…

    other 2023年5月7日
    00
  • C++容器适配与栈的实现及dequeque和优先级详解

    C++容器适配与栈的实现及deque和优先级详解 容器适配器(Container Adapters)概述 容器适配器是C++标准库中的一类特殊容器,它们是由已有的基本数据结构通过组合和封装,扩展而来的。C++标准库提供了三种常见的容器适配器:栈(stack)、队列(queue)和优先级队列(priority_queue)。本文将重点讲解栈的实现以及deque…

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