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.pswp.cn/news/696777.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696777.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696777.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【大數據】Flink 之部署篇

Flink 之部署篇 1.概述和參考架構2.可重復的資源清理3.部署模式3.1 Application 模式3.2 Per-Job 模式&#xff08;已廢棄&#xff09;3.3 Session 模式 Flink 是一個多用途框架&#xff0c;支持多種不同的混合部署方案。下面&#xff0c;我們將簡要介紹 Flink 集群的構建模塊、…

流動資金貸款管理辦法

流動資金貸款管理辦法 (2024年1月30日國家金融監督管理總局令2024年第2號公布 自2024年7月1日起施行) 第一章 總 則 第一條 為規范銀行業金融機構流動資金貸款業務經營行為&#xff0c;加強流動資金貸款審慎經營管理&#xff0c;促進流動資金貸款業務健康發展&#xff0c;依…

【html學習筆記】3.表單元素

1.文本框 1.1 語法 <input type "text">表示文本框。且只能寫一行 1.2 屬性 使用屬性size 設置文本框大小 <input type"text" size"10">2. 使用屬性value 來設置文本框的默認文字 <input type"text" size"…

Vue狀態管理庫-Pinia

一、Pinia是什么&#xff1f; Pinia 是 Vue 的專屬狀態管理庫&#xff0c;它允許支持跨組件或頁面共享狀態&#xff0c;即共享數據&#xff0c;他的初始設計目的是設計一個支持組合式API的 Vue 狀態管理庫&#xff08;因為vue3一個很大的改變就是組合式API&#xff09;,當然這…

PFA三角燒瓶實驗室PFA錐形瓶本底純凈耐腐蝕性強

PFA三角燒瓶外觀呈平底圓錐狀&#xff0c;下闊上狹&#xff0c;有一圓柱形頸部&#xff0c;上方有一較頸部闊的開口&#xff0c;可用塞子封閉。PFA三角燒瓶也稱PFA錐形瓶&#xff0c;PFA反應瓶&#xff0c;PFA三角燒瓶、PFA依氏燒瓶、PFA錐形燒瓶&#xff0c;PFA鄂倫麥爾瓶等。…

普中51單片機學習(串口通信)

串口通信 原理 計算機通信是將計算機技術和通信技術的相結合&#xff0c;完成計算機與外部設備或計算機與計算機之間的信息交換 。可以分為兩大類&#xff1a;并行通信與串行通信。并行通信通常是將數據字節的各位用多條數據線同時進行傳送 。控制簡單、傳輸速度快&#xff1…

【大模型】finetune 百川2

使用官網例子finetune百川2&#xff0c;微調腳本如下 模型為baichuan_chat_13B_v1 export CUDA_VISIBLE_DEVICES1 hostfile"" deepspeed --hostfile$hostfile baichuan_fineturn/fine-tune/fine-tune.py \--report_to "none" \--data_path "baichu…

2.22號qt

1.使用信號和槽實現多個界面跳轉 1.1準備兩個界面 1.2第一個界面準備signal 1.3第二個界面準備slot 1.4將第一個界面的信號和槽進行連接 2.qss登錄界面升級優化 2.1概念 Qss是Qt程序界面中用來設置控件的背景圖片、大小、字體顏色、字體類型、按鈕狀態變化等屬性&#xff…

【Python】Python實現串口通信(Python+Stm32)

&#x1f389;歡迎來到Python專欄~Python實現串口通信 ☆* o(≧▽≦)o *☆嗨~我是小夏與酒&#x1f379; ?博客主頁&#xff1a;小夏與酒的博客 &#x1f388;該系列文章專欄&#xff1a;Python學習專欄 文章作者技術和水平有限&#xff0c;如果文中出現錯誤&#xff0c;希望…

springboot208基于springboot物流管理系統

基于spring boot物流管理系統設計與實現 摘 要 社會發展日新月異&#xff0c;用計算機應用實現數據管理功能已經算是很完善的了&#xff0c;但是隨著移動互聯網的到來&#xff0c;處理信息不再受制于地理位置的限制&#xff0c;處理信息及時高效&#xff0c;備受人們的喜愛。…

jax可微分編程的筆記

jax可微分編程的筆記 1.1.1 求導的基本概念 所謂的導數是一個從集合F到自身的映射. 有時,我們也將一個從函數到函數的映射稱為一個操作, 這里的操作在物理學中也被稱作一個算符. 但在計算機中的操作符相當于數學中的一個函數,而非從 函數到函數的映射. 應該指出的是,如果我們…

vue小記——this(2)

在Vue的方法中使用普通函數作為回調函數&#xff0c;那么在該回調函數中&#xff0c;this將不會指向Vue實例&#xff0c;而是指向全局對象&#xff08;在瀏覽器中是window&#xff09;。 錯誤 &#xff1a; export default { data() { return { message: Hello Vue! }; …

npm 包發布

name publish必填項&#xff08;version,nameverson構成唯一標識&#xff09;&#xff0c;唯一&#xff0c;所以publish前驗證庫里是否存在該名稱&#xff0c;方式npm info xxx npm ERR! 404 cy_test is not in the npm registry.可以使用。規則&#xff1a;不能以.或者_開頭…

maven工程打包引入本地jar包

1、通過maven生成本地區倉庫包 mvn install:install-file --settings D:\lkx\download\apache-maven-3.6.3\conf\settings.xml -Dfileaspose-cad-21.8.jar -DartifactIdaspose-cad -DgroupIdsystem.core -Dversion21.8 -Dpackagingjar -DgeneratePomtrue # --settings&#xf…

進程線程間的通信:2024/2/22

作業1&#xff1a;代碼實現線程互斥機制 代碼&#xff1a; #include <myhead.h>//臨界資源 int num10;//創建一個互斥鎖 pthread_mutex_t mutex;//任務一 void *task1(void *arg) {//獲取鎖資源pthread_mutex_lock(&mutex);num123;sleep(3);printf("task1:num…

PacketSender-用于發送/接收 TCP、UDP、SSL、HTTP 的網絡實用程序

PacketSender-用于發送/接收 TCP、UDP、SSL、HTTP 的網絡實用程序 PacketSender是一款開源的用于發送/接收 TCP、UDP、SSL、HTTP 的網絡實用程序&#xff0c;作者為dannagle。 其官網地址為&#xff1a;https://packetsender.com/&#xff0c;Github源代碼地址&#xff1a;htt…

【AI繪畫工具分別有哪些?】

目前有許多AI繪畫工具可供選擇&#xff0c;以下列舉了一些常見的AI繪畫工具&#xff1a; 1. DeepArt.io&#xff1a;該工具使用深度學習算法生成藝術風格的圖像&#xff0c;并可以將輸入圖像與指定的藝術風格進行合并。 2. Prisma&#xff1a;這是一款非常流行的AI繪畫應用&a…

SQL Server —— While語句循環

一&#xff1a;簡介 while 循環是有條件的循環控制語句。滿足條件后&#xff0c;再執行循環體中的SQL語句。 while: break, 如果有多條語句可以在while后面添加begin-end。關于while的語法 while(條件) -- begin -- 語句1 -- 語句2 -- break 根據情況是否添加break -- end 二…

leetcode日記(32)字符串相乘

做了很久很久……真的太繁瑣了&#xff01;&#xff01; class Solution { public:string multiply(string num1, string num2) {string s;string str;if (num1 "0" || num2 "0") return "0";for(int inum2.size()-1;i>0;i--){int c2num2[…

Open CASCADE學習|全局屬性

目錄 1、概念解釋 質心&#xff1a; 重心&#xff1a; 慣性矩&#xff1a; 慣性矩陣&#xff1a; 主慣性矩&#xff1a; 靜態慣性矩&#xff1a; 2、API 1、概念解釋 質心&#xff1a; 質心是質量中心的簡稱&#xff0c;指物質系統上被認為質量集中于此的一個假想點。…