首页 > 其他分享 >C语言实现 读取写入ini文件实现

C语言实现 读取写入ini文件实现

时间:2022-12-23 17:14:08浏览次数:37  
标签:NULL sLine 读取 title filename char ini key C语言

复制代码

#include <stdio.h>  
#include <string.h>  
  
/* 
 * 函数名:         GetIniKeyString 
 * 入口参数:        title 
 *                      配置文件中一组数据的标识 
 *                  key 
 *                      这组数据中要读出的值的标识 
 *                  filename 
 *                      要读取的文件路径 
 * 返回值:         找到需要查的值则返回正确结果 
 *                  否则返回NULL 
 */  
char *GetIniKeyString(char *title,char *key,char *filename)  
{  
    FILE *fp;  
    int  flag = 0;  
    char sTitle[32], *wTmp;  
    static char sLine[1024];  
  
    sprintf(sTitle, "[%s]", title);  
    if(NULL == (fp = fopen(filename, "r"))) {  
        perror("fopen");  
        return NULL;  
    }  
  
    while (NULL != fgets(sLine, 1024, fp)) {  
        // 这是注释行  
        if (0 == strncmp("//", sLine, 2)) continue;  
        if ('#' == sLine[0])              continue;  
  
        wTmp = strchr(sLine, '=');  
        if ((NULL != wTmp) && (1 == flag)) {  
            if (0 == strncmp(key, sLine, wTmp-sLine)) { // 长度依文件读取的为准  
                sLine[strlen(sLine) - 1] = '\0';  
                fclose(fp);  
                return wTmp + 1;  
            }  
        } else {  
            if (0 == strncmp(sTitle, sLine, strlen(sLine) - 1)) { // 长度依文件读取的为准  
                flag = 1; // 找到标题位置  
            }  
        }  
    }  
    fclose(fp);  
    return NULL;  
}  
  
/* 
 * 函数名:         GetIniKeyInt 
 * 入口参数:        title 
 *                      配置文件中一组数据的标识 
 *                  key 
 *                      这组数据中要读出的值的标识 
 *                  filename 
 *                      要读取的文件路径 
 * 返回值:         找到需要查的值则返回正确结果 
 *                  否则返回NULL 
 */  
int GetIniKeyInt(char *title,char *key,char *filename)  
{  
    return atoi(GetIniKeyString(title, key, filename));  
}  
  
/* 
 * 函数名:         PutIniKeyString 
 * 入口参数:        title 
 *                      配置文件中一组数据的标识 
 *                  key 
 *                      这组数据中要读出的值的标识 
 *                  val 
 *                      更改后的值 
 *                  filename 
 *                      要读取的文件路径 
 * 返回值:         成功返回  0 
 *                  否则返回 -1 
 */  
int PutIniKeyString(char *title,char *key,char *val,char *filename)  
{  
    FILE *fpr, *fpw;  
    int  flag = 0;  
    char sLine[1024], sTitle[32], *wTmp;  
  
    sprintf(sTitle, "[%s]", title);  
    if (NULL == (fpr = fopen(filename, "r")))  
        PRN_ERRMSG_RETURN("fopen");// 读取原文件  
    sprintf(sLine, "%s.tmp", filename);  
    if (NULL == (fpw = fopen(sLine,    "w")))  
        PRN_ERRMSG_RETURN("fopen");// 写入临时文件  
  
    while (NULL != fgets(sLine, 1024, fpr)) {  
        if (2 != flag) { // 如果找到要修改的那一行,则不会执行内部的操作  
            wTmp = strchr(sLine, '=');  
            if ((NULL != wTmp) && (1 == flag)) {  
                if (0 == strncmp(key, sLine, wTmp-sLine)) { // 长度依文件读取的为准  
                    flag = 2;// 更改值,方便写入文件  
                    sprintf(wTmp + 1, "%s\n", val);  
                }  
            } else {  
                if (0 == strncmp(sTitle, sLine, strlen(sLine) - 1)) { // 长度依文件读取的为准  
                    flag = 1; // 找到标题位置  
                }  
            }  
        }  
  
        fputs(sLine, fpw); // 写入临时文件  
    }  
    fclose(fpr);  
    fclose(fpw);  
  
    sprintf(sLine, "%s.tmp", filename);  
    return rename(sLine, filename);// 将临时文件更新到原文件  
}  
  
/* 
 * 函数名:         PutIniKeyString 
 * 入口参数:        title 
 *                      配置文件中一组数据的标识 
 *                  key 
 *                      这组数据中要读出的值的标识 
 *                  val 
 *                      更改后的值 
 *                  filename 
 *                      要读取的文件路径 
 * 返回值:         成功返回  0 
 *                  否则返回 -1 
 */  
int PutIniKeyInt(char *title,char *key,int val,char *filename)  
{  
    char sVal[32];  
    sprintf(sVal, "%d", val);  
    return PutIniKeyString(title, key, sVal, filename);  
}  
  
  
  
int main(int argc,char *argv[])  
{  
    printf("%s\n", GetIniKeyString("DOG", "name", "config.ini"));  
    printf("%d\n", GetIniKeyInt("DOG", "age", "config.ini"));  
    PutIniKeyString("CAT", "name", "ccc", "config.ini");  
    PutIniKeyInt("DOG", "age", 56, "config.ini");  
    return 0;  
}  
复制代码

这是我自己创建的一个config.ini文件

#[CAT]
[CAT]
//name=dsfdsf
age=34
name=aaa
name1=ooo
//[DOG]
[DOG]
name=bbb
name1=xxx
age=25

 

当运行程序后。结果为:

bbb
25

最后config.ini文件变为:

#[CAT]
[CAT]
//name=dsfdsf
age=34
name=ccc
name1=ooo
//[DOG]
[DOG]
name=bbb
name1=xxx
age=56

标签:NULL,sLine,读取,title,filename,char,ini,key,C语言
From: https://www.cnblogs.com/kn-zheng/p/17001107.html

相关文章

  • c++ 读取Ini文件
    头文件#include<atlstr.h> C++读取INI文件-疯封风-博客园(cnblogs.com)......
  • [数据结构]单向链表及其基本操作(C语言)
    单向链表什么是单向链表链表是一种物理储存单元上非连续、非顺序的储存结构。它由一系列结点(链表中每一个元素称为结点)组成,结点可动态生成。每个结点包括两个部分:一个是......
  • NoUniqueBeanDefinitionException expected single matching bean but found 2异常的
    NoUniqueBeanDefinitionException:Noqualifyingbeanoftype'xxx'available:expectedsinglematchingbeanbutfound2:x,y的解决办法 一.异常现象在利用Spring......
  • 7-1 找最小的字符串 [c语言qsort函数的使用]
    题目题要求编写程序,针对输入的N个字符串,输出其中最小的字符串。输入样例5LiWangZhaJinXian输出样例Minis:Jin核心使用qsort函数函数原型:qsort(起始地......
  • 利用rclone 将本地文件上传至minio
    部署:curlhttps://rclone.org/install.sh|sudobash配置rclone的配置文件,rclone默认会读取/root/.config/rclone/rclone.conf如果该文件没有那手动创建一下即可......
  • vue中读取本地Excel文件
    readExcelFileconstXLSX=require('xlsx')constpath="./file/file.xlsx"//放在public目录下的文件可以直接访问axios.get(path,{responseType:'arraybuffer'......
  • Go 快速入门指南 - init 函数
    概述init()函数 是一个特殊的函数,一般称为初始化函数,不能被调用。 在每个文件里面,当程序启动或者文件被作为包引用的时候,init()函数就会自动执行,一般用来做一些包的......
  • VUE3状态管理Pinia使用介绍
    vue3中推荐使用的状态管理工具:pinia,真的很好用官方文档,中文文档一、安装piniayarnaddpinia#或者使用npmnpminstallpinia二、src文件夹下新建store文件夹,并新建......
  • Pinia 全局状态管理工具
    Pinia第一章(介绍Pinia)前言全局状态管理工具Pinia.js有如下特点:完整的ts的支持;足够轻量,压缩后的体积只有1kb左右;去除mutations,只有state,getters,a......
  • 微服务系列:分布式文件存储之 MinIO 入门指南
    经过前面多篇文章我们学习了服务网关、服务调用、服务注册、服务监控等微服务系列的的相关知识,今天开始我们来学习一下分布式文件的相关知识。首先我们从学习​​MinIO​​......