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日

相关文章

  • i5 9400F和i5 8400哪个值得买 Intel酷睿i5-9400F和8400区别对比

    i5 9400F和i5 8400的区别对比 1. 性能比较 i5 9400F 核心/线程数:6核心/6线程 基础频率:2.9 GHz 最大睿频:4.1 GHz 缓存:9 MB TDP:65W i5 8400 核心/线程数:6核心/6线程 基础频率:2.8 GHz 最大睿频:4.0 GHz 缓存:9 MB TDP:65W 从性能上来看,i5 9400F和i5 …

    other 2023年8月6日
    00
  • 电脑重视自动重启关机该怎么查找原因?

    电脑自动重启或关机的原因可能有很多种,例如操作系统的错误、硬件故障,甚至是电源问题。如果电脑出现了这种情况,我们应该先了解问题的原因,然后才能采取正确的措施去解决它。 以下是检查电脑自动重启或关机问题的完整攻略: 第一步:检查系统事件日志 打开“事件查看器”。 在左侧面板中,依次展开“Windows日志”→“系统”。 在右侧面板中,会显示所有系统事件的列表。…

    other 2023年6月27日
    00
  • 中土世界战争之影攻城时游戏无限加载怎么办 无限加载多种解决方法

    中土世界战争之影是一款非常受欢迎的游戏,但是有时在攻城时可能会出现无限加载的情况。这篇攻略将为玩家介绍多种解决方法。 问题分析 首先,我们需要分析问题。一般来说,游戏无限加载的原因有以下几种: 网络连接问题:网络不稳定或者网络速度太慢,导致游戏无法正常加载。 服务器问题:游戏服务器可能出现故障或维护,导致无法正常连接。 游戏本身问题:游戏可能存在一些程序错误…

    other 2023年6月25日
    00
  • 学习Javascript面向对象编程之封装

    下面我将详细讲解学习Javascript面向对象编程之封装的完整攻略。 什么是封装 封装(Encapsulation)是一种将数据与操作数据的方法表示为一个单一实体(即类)的技术。封装可以使得类的对象被访问时不能直接访问对象的状态,而是通过类公开的接口进行操作。封装有助于提高代码的安全性和可维护性。 如何封装 在JavaScript中,封装通常通过构造函数和…

    other 2023年6月26日
    00
  • Android中XUtils3框架使用方法详解(一)

    Android中XUtils3框架使用方法详解(一) 简介 XUtils3是一款在Android开发中常用的开源框架,它提供了许多方便的工具和功能,可以简化开发过程并提高效率。本攻略将详细介绍XUtils3框架的使用方法。 步骤一:导入XUtils3库 首先,我们需要在项目中导入XUtils3库。可以通过以下步骤完成导入: 在项目的build.gradle文…

    other 2023年9月6日
    00
  • 微信小程序 配置文件详细介绍

    下面是“微信小程序配置文件详细介绍”的完整攻略。 微信小程序配置文件详细介绍 引言 在微信小程序开发中,配置文件十分重要。配置文件可用于配置小程序的全局变量、页面路径、底部tabbar等功能,可以帮助我们更好的管理和维护小程序。接下来,我们将详细介绍微信小程序配置文件的使用。 全局配置文件 小程序的全局配置文件为 app.json,用于配置全局性的属性,如小…

    other 2023年6月25日
    00
  • baseadapter基础知识

    BaseAdapter基础知识攻略 BaseAdapter是Android中的一个适配器类,用于将数据绑定到ListView、GridView等控件上。本攻略将介绍BaseAdapter的基础知识,包括BaseAdapter的作用、使用方法、方法等。 BaseAdapter的作用 BaseAdapter的作用是将数据绑定到ListView、GridView等…

    other 2023年5月7日
    00
  • 支付宝APP支付(IOS手机端+java后台)版

    下面是支付宝APP支付(IOS手机端+java后台)版的完整攻略。 准备工作 在开始之前,需要完成以下准备工作: 开通支付宝商家账号,获取应用ID和私钥。 集成SDK,包括iOS和Java SDK。 配置AliSDK的参数,包括应用ID、私钥等等。 在支付宝商家后台配置应用信息,包括回调URL、权限等等。 客户端代码 SDK下载 首先,需要将支付宝提供的SD…

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