C语言读取 ini 配置文件,修改/添加键值对

C语言读取 ini 配置文件,修改/添加键值对

C语言读取 ini 配置文件,对section中的键值对进行修改/添加,如果section不存在,则在末尾将新的section/key/value 添加进去。

一、了解什么是INI文件?

ini 文件是Initialization File的缩写,即初始化文件,这是用来配置应用软件以实现不同用户的要求。

二、INI文件的格式

INI文件由节、键、值组成。

一个简单的的INI文件例子如下:

/*test.ini*/
[city]
beijing =  hello-beijing
shanghai = hello-shanghai#information
[study]
highschool = huafuyi
university = guofangkeda[xinming]
name = lilei

如上例子,[city]就是节,=号左边的值是键,=号右边的是值。

  • 读取key对应的value值


/** 功能:     读取key对应的value值* 入口参数: filename*                要读取的文件路径*            title*                配置文件中一组数据的标识*            key*                这组数据中要读出的值的标识* 返回值:   找到需要查的值则返回正确结果 0*            否则返回-1*/
int GetIniKeyString(char* filename, char* title, char* key, char* buf)
{FILE* fp;int  flag = 0;char sTitle[64], * wTmp;char sLine[1024];// 节section字符串sprintf(sTitle, "[%s]", title);if (NULL == (fp = fopen(filename, "r"))) {printf("open %s failed.\n", filename);perror("fopen failed.\n");return -1;}// 读取ini中的每一行while (NULL != fgets(sLine, 1024, fp)) {// 处理ini文件中的注释行if (0 == strncmp("//", sLine, 2)) continue;if (('#' == sLine[0]) || ';' == sLine[0])continue;// 定位=的位置wTmp = strchr(sLine, '=');if ((NULL != wTmp) && (1 == flag)) {if (0 == strncmp(key, sLine, strlen(key))) { // 长度依文件读取的为准  sLine[strlen(sLine) - 1] = '\0';fclose(fp);while (*(wTmp + 1) == ' ') {wTmp++;}// 获取key对应的valuestrcpy(buf, wTmp + 1);return 0;}}else {if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { // 长度依文件读取的为准  // 不存在键值对的情况下,标记flagflag = 1; // 找到标题位置  }}}fclose(fp);return -1;
}
  • 修改/添加key-value键值对


/*OK--查找section中是否存在key,存在则将key对应的值修改为val,不存在则将key对应的val添加在section后面。*/
int PutIniKeyString2(char* filename, char* title, char* key, char* val)
{FILE* fpr, * fpw;int  flag = 0;int rtn = 0;char sLine[1024], sTitle[32], * wTmp;sprintf(sTitle, "[%s]", title);if (NULL == (fpr = fopen(filename, "r"))){printf("读取原文件失败.\n");return -1;// 读取原文件 }// 临时文件名sprintf(sLine, "%s.tmp", filename);if (NULL == (fpw = fopen(sLine, "w"))){printf("写入失败.\n");return -1;// 写入临时文件    }while (NULL != fgets(sLine, 1024, fpr)){if (2 != flag){ // 如果找到要修改的那一行,则不会执行内部的操作  wTmp = strchr(sLine, '=');if ((1 == flag)){// 找到对应的keyif ((NULL != wTmp) && (0 == strncmp(key, sLine, strlen(key)))){ // 长度依文件读取的为准 flag = 2;// 更改值,方便写入文件  sprintf(wTmp + 1, " %s\n", val);}else{if ((sLine[0] == '\n')){/* 没有找到对应的key,则在section末尾添加新的key/value *///fseek(fpw, 0, SEEK_END);-((long)strlen(sLine))fseek(fpw, 0, SEEK_CUR);fprintf(fpw, "%s = %s\n", key, val);flag = 0;}}}else{// 找到section的位置if (0 == strncmp(sTitle, sLine, strlen(sTitle))){ // 长度依文件读取的为准flag = 1; // 找到标题位置  }}}fputs(sLine, fpw); // 写入临时文件 }if (-1 == flag){   /* 没有找到对应的section,则在文件末尾添加新的section/key/value */fseek(fpw, 0, SEEK_END);fprintf(fpw, "%s\n", sTitle);fprintf(fpw, "%s = %s\n\n", key, val);}fclose(fpr);fclose(fpw);sprintf(sLine, "%s.tmp", filename);rtn = rename(sLine, filename);// 将临时文件更新到原文件  if (rtn != 0){if (errno == EEXIST){// 如果目标文件已经存在,需要先删除,再重命名if (remove(filename) == 0){if (rename(sLine, filename) == 0){return 0;}else{return -1;}}}}return rtn;
}
  • 测试程序

头文件 ini.h

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <string.h>constexpr auto BUF_SIZE = 256;int GetIniKeyString(char* filename, char* title, char* key, char* buf);int PutIniKeyString2(char* filename, char* title, char* key, char* val);

主函数 main.c

#include "ini.h"int main(int argc, char const* argv[])
{int ret;char buff[100];//readSpeed();//readExcel();int xishu_gain = 2 << 25;//滤波器系数放大倍数.*******************OK**************************char filename[] = "./test.ini";char title[] = "city";char key[] = "beijing";ret = GetIniKeyString(filename, title, key, buff);//读取ini文件key对应的vlaueprintf("ret:%d,%s\n", ret, buff);char filename[] = "./test.ini";//char title2[] = "study";//char key2[] = "highschool";//ret = GetIniKeyString(filename, title2, key2, buff);//读取ini文件key对应的vlaue//printf("ret:%d,%s\n", ret, buff);char title3[] = "xinming";char key3[] = "name2";char value3[] = "xiao-hua";ret = PutIniKeyString2(filename, title3, key3, value3);//修改ini文件key对应的vlaueprintf("put ret:%d,%s\n", ret, value3);//ret = GetIniKeyString(filename, title3, key3, buff);//printf("ret:%d,%s\n", ret, buff);//****************OK*****************************return 0;
}

测试结果ini文件:

/*test.ini*/
[city]
beijing =  hello-beijing
shanghai = hello-shanghai
wuhan = hello-wuhan
wuhan1 = hello-wu-han
wuhan2 = hello-wuhan#information
[study]
highschool = huafuyi
university = guofangkeda
xiaoxue = huafucunxiao
xiaoxue1 = huafu-cunxiao1[xinming]
name = lilei
name1 = xiao-ming1
name2 = xiao-hua
/*test.ini*/
[city]
beijing =  hello-beijing
shanghai = hello-shanghai
wuhan = hello-wuhan
wuhan1 = hello-wu-han
wuhan2 = hello-wuhan#information
[study]
highschool = huafuyi
university = guofangkeda
xiaoxue = huafucunxiao
xiaoxue1 = huafu-cunxiao1[xinming]
name = lilei
name1 = xiao-ming1
name2 = xiao-hua[tizhi]
weight = 80kg
weight1 = 80kg

  • 打开或创建名为"config.ini"的文件

{FILE* file = fopen("config.ini", "w");//打开或创建名为"config.ini"的文件if (file == NULL){printf("无法创建文件\n");return -1;}// 写入配置项到文件fprintf(file, "[Section]\n");fprintf(file, "key=value\n");fprintf(file, "\n[Another Section]\n");fprintf(file, "another_key=another_value\n");fclose(file); // 关闭文件
}

参考:

1、C语言读取写入 ini 配置文件_c读取ini配置文件-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/488354.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity Aaimation Rigging使用多个约束导致部分约束失去作用

在应用多个约束时&#xff0c;在Hierarchy的顺序可能会影响最终的效果。例如先应用了Aim Constraint&#xff0c;然后再应用Two Bone Constraint&#xff0c;可能会导致Two Bone Constraint受到Aim Constraint的影响而失效。因此&#xff0c;在使用多个约束时&#xff0c;应该仔…

5G网络(接入网+承载网+核心网)

5G网络&#xff08;接入网承载网核心网&#xff09; 一、5G网络全网架构图 这张图分为左右两部分&#xff0c;右边为无线侧网络架构&#xff0c;左边为固定侧网络架构。 无线侧&#xff1a;手机或者集团客户通过基站接入到无线接入网&#xff0c;在接入网侧可以通过RTN或者IP…

【坑】Spring Boot整合MyBatis,一级缓存失效

一、Spring Boot整合MyBatis&#xff0c;一级缓存失效 1.1、概述 MyBatis一级缓存的作用域是同一个SqlSession&#xff0c;在同一个SqlSession中执行两次相同的查询&#xff0c;第一次执行完毕后&#xff0c;Mybatis会将查询到的数据缓存起来&#xff08;缓存到内存中&#xf…

Vue2页面转化为Vue3

vue2element-ui转化为Vue3element plus 后台管理系统&#xff1a;增删查改 vue2页面&#xff1a; <template><div class"app-container"><div><el-form:model"queryParams"ref"queryForm"size"small":inline&qu…

Stable Diffusion 3 震撼发布,采用Sora同源技术,文字终于不乱码了

Stable Diffusion 3 和 Sora 一样采用了 diffusion transformer 架构。 继 OpenAI 的 Sora 连续一周霸屏后&#xff0c;昨晚&#xff0c;生成式 AI 顶级技术公司 Stability AI 也放了一个大招 ——Stable Diffusion 3。该公司表示&#xff0c;这是他们最强大的文生图模型。 与…

2024年 Openai的API相关全部概论汇总(通用版)

2024年 Openai的API相关全部概论汇总&#xff08;通用版&#xff09; 文章目录 2024年 Openai的API相关全部概论汇总&#xff08;通用版&#xff09;一、前言1、python快速开始 二、Openai 平台以及相关项目1、Openai的API管理平台2、ChatGPT项目推荐&#xff08;1&#xff09;…

会声会影2024官方重磅发布更新内径讲解介绍

一、功能特点 会声会影2024作为一款专业的视频编辑软件&#xff0c;继承了之前版本的强大功能&#xff0c;并进行了诸多创新和改进。其主要功能特点包括&#xff1a; 多轨时间轴编辑&#xff1a;支持多轨音视频同时编辑&#xff0c;便于用户精细调整各个元素的时间和位置。丰…

2024年 前端JavaScript入门到精通 第四天 笔记

4.1 函数的基本使用以及封装练习 ★ 函数命名规范 4.2 函数的参数以及默认参数 函数的灵魂&#xff01;&#xff01;&#xff01; 4.3 函数封装数组求和案例 4.4 函数返回值return 4.5 函数返回值细节以及上午总结 4.6 函数返回值案例-求最大值和最 4.7 函数复习以及断点进入函…

【补充】linux内核升级

目录 步骤一&#xff1a;准备内核下载的repo文件 步骤二&#xff1a;yum安装lt长期稳定版 步骤三&#xff1a;查看内核序号&#xff0c;并绑定开机启动选择的序号 步骤四&#xff1a;重启查看 查看当前的内核版本 步骤一&#xff1a;准备内核下载的repo文件 内核升级 cat …

RISC-V知识总结 —— 指令集

资源1: RISC-V China – RISC-V International 资源2: RISC-V International – RISC-V: The Open Standard RISC Instruction Set Architecture 资源3: RV32I, RV64I Instructions — riscv-isa-pages documentation 1. 指令集架构的类型 在讨论RISC-V或任何处理器架构时&…

部署Docker私有镜像仓库Harbor

Harbor介绍 Harbor 是为企业用户设计的开源镜像仓库项目&#xff0c;包括了权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面、自我注册、HA等企业必需的功能&#xff0c;同时针对中国用户的特点&#xff0c;设计镜像复制和中文支持等功能。 官网&#xff1a;h…

后端经典面试题合集

目录 1. Java基础1-1. JDK 和 JRE 和 JVM 分别是什么&#xff0c;有什么区别&#xff1f;1-2. 什么是字节码&#xff1f;采用字节码的最大好处是什么&#xff1f; 1. Java基础 1-1. JDK 和 JRE 和 JVM 分别是什么&#xff0c;有什么区别&#xff1f; JDK 是Java开发工具包&am…