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

目录
  • 一、了解什么是INI文件?
  • 二、INI文件的格式
  • 三、解析上述文件
  • 四、测试如下

一、了解什么是INI文件?

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

二、INI文件的格式

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

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

[Setting]
INIT_FLAG=0;
VOLUME=1;
LANGUAGE=1;

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

三、解析上述文件

/*ini.h*/
#ifndef INI_H
#define INI_H

#include <stdio.h>
#include <string.h>

int GetIniKeyString(char *title,char *key,char *filename,char *buf);

int PutIniKeyString(char *title,char *key,char *val,char *filename);

#endif /*INI_H*/
/*ini.c*/
#include <stdio.h>
#include <string.h>
/*
    * 函数名:         GetIniKeyString
    * 入口参数:        title
    *                      配置文件中一组数据的标识
    *                  key
    *                      这组数据中要读出的值的标识
    *                  filename
    *                      要读取的文件路径
    * 返回值:         找到需要查的值则返回正确结果 0
    *                  否则返回-1
    */
int GetIniKeyString(char *title,char *key,char *filename,char *buf)
{
    FILE *fp;
    int  flag = 0;
    char sTitle[64], *wTmp;
    char sLine[1024];
    sprintf(sTitle, "[%s]", title);

    if(NULL == (fp = fopen(filename, "r"))) {
        perror("fopen");
        return -1;
    }
    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, strlen(key))) { // 长度依文件读取的为准
                sLine[strlen(sLine) - 1] = '\0';
                fclose(fp);
                while(*(wTmp + 1) == ' '){
                    wTmp++;
                }
                strcpy(buf,wTmp + 1);
                return 0;
            }
        } else {
            if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { // 长度依文件读取的为准
                flag = 1; // 找到标题位置
            }
        }
    }
    fclose(fp);
    return -1;
}        

/*
    * 函数名:         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")))
        return -1;// 读取原文件
    sprintf(sLine, "%s.tmp", filename);
    if (NULL == (fpw = fopen(sLine,    "w")))
        return -1;// 写入临时文件
    while (NULL != fgets(sLine, 1024, fpr)) {
        if (2 != flag) { // 如果找到要修改的那一行,则不会执行内部的操作
            wTmp = strchr(sLine, '=');
            if ((NULL != wTmp) && (1 == flag)) {
                if (0 == strncmp(key, sLine, strlen(key))) { // 长度依文件读取的为准
                    flag = 2;// 更改值,方便写入文件
                    sprintf(wTmp + 1, " %s\n", val);
                }
            } else {
                if (0 == strncmp(sTitle, sLine, strlen(sTitle))) { // 长度依文件读取的为准
                    flag = 1; // 找到标题位置
                }
            }
        }
        fputs(sLine, fpw); // 写入临时文件
    }
    fclose(fpr);
    fclose(fpw);
    sprintf(sLine, "%s.tmp", filename);
    return rename(sLine, filename);// 将临时文件更新到原文件
}

上述两个函数是简单的解析函数,因为ini文件有很多种解析方式,根据不同的需求解析也不同

所以要进行修改

比如我的注释符号是 “ ;”,所以我需要修改

并且根据实际功能需求也可以进行进一步的封装

四、测试如下

ini样本文件

/*test.ini*/
[city]
beijing =  hello-beijing
shanghai = hello-shanghai

#information
[study]
highschool = xxxx
university = yyyy

test.c程序

/*test.c*/
#include "ini.h"
#include <stdio.h>
int main(int argc, char const *argv[])
{
    char buff[100];
    int ret;

    ret = GetIniKeyString("city","beijing","./test.ini",buff);
    printf("ret:%d,%s\n",ret,buff);

    ret = GetIniKeyString("study","highschool","./test.ini",buff);
    printf("ret:%d,%s\n",ret,buff);

    ret = PutIniKeyString("study","highschool","zzzz","./test.ini");
    printf("put ret:%d\n",ret);
    ret = GetIniKeyString("study","highschool","./test.ini",buff);
    printf("ret:%d,%s\n",ret,buff);
    return 0;
}

结果如下:

ret:0,hello-beijing
ret:0,xxxx
put ret:0
ret:0,zzzz

相应的test.ini的study段highschool项变成了zzzz.

这里还要注意,section使用中文字符可能会无法识别!

到此这篇关于C语言读取写入ini配置文件的方法实现的文章就介绍到这了,更多相关C语言读取写入ini 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入剖析Android中init进程实现的C语言源码

    概述 init是一个进程,确切的说,它是Linux系统中用户空间的第一个进程.由于Android是基于Linux内核的,所以init也是Android系统中用户空间的第一个进程.init的进程号是1.作为天字第一号进程,init有很多重要的工作: init提供property service(属性服务)来管理Android系统的属性. init负责创建系统中的关键进程,包括zygote. 以往的文章一上来就介绍init的源码,但是我这里先从这两个主要工作开始.搞清楚这两个主要工作是如何实现的,我

  • C语言 module_init函数与initcall案例详解

    module_init这个函数对做驱动的人来说肯定很熟悉,这篇文章用来跟一下这个函数的实现. 在include/linux/init.h里面有module_init的定义,自然,因为一个module可以在内核启动时自动加载进内核,也可以由我们手动在需要时加载进内核,基于这种场景,内核使用了MODULE这个宏,见代码: #ifndef MODULE #ifndef __ASSEMBLY__ ... #define __define_initcall(level,fn,id) \ static in

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

    目录 一.了解什么是INI文件? 二.INI文件的格式 三.解析上述文件 四.测试如下 一.了解什么是INI文件? ini 文件是Initialization File的缩写,即初始化文件,这是用来配置应用软件以实现不同用户的要求. 二.INI文件的格式 INI文件由节.键.值组成. 一个简单的的INI文件例子如下: [Setting] INIT_FLAG=0; VOLUME=1; LANGUAGE=1; 如上例子,[Setting]就是节,=号左边的值是键,=号右边的是值. 三.解析上述文件

  • 在SpringBoot下读取自定义properties配置文件的方法

    SpringBoot工程默认读取application.properties配置文件.如果需要自定义properties文件,如何读取呢? 一.在resource中新建.properties文件 在resource目录下新建一个config文件夹,然后新建一个.properties文件放在该文件夹下.如图remote.properties所示 二.编写配置文件 remote.uploadFilesUrl=/resource/files/ remote.uploadPicUrl=/resource

  • Python实现读写INI配置文件的方法示例

    本文实例讲述了Python实现读写INI配置文件的方法.分享给大家供大家参考,具体如下: # -*- coding: utf-8 -*- import ConfigParser import os '''读写配置文件的类 [section] logpath = D:\log\ imageminsize = 200 ''' class ConfigFile: '''构造函数:初始化''' def __init__(self,fileName): fileName = unicode(fileNam

  • Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法

    fs模块.js: /* 1. fs.stat 检测是文件还是目录(目录 文件是否存在) 2. fs.mkdir 创建目录 (创建之前先判断是否存在) 3. fs.writeFile 写入文件(文件不存在就创建,但不能创建目录) 4. fs.appendFile 写入追加文件 5.fs.readFile 读取文件 6.fs.readdir 读取目录 7.fs.rename 重命名 8. fs.rmdir 删除目录 9. fs.unlink 删除文件 */ var fs=require('fs');

  • C#中读写INI配置文件的方法

    在作应用系统开发时,管理配置是必不可少的.例如数据库服务器的配置.安装和更新配置等等.由于Xml的兴起,现在的配置文件大都是以xml文档来存储.比如Visual Studio.Net自身的配置文件Mashine.config,Asp.Net的配置文件Web.Config,包括我在介绍Remoting中提到的配置文件,都是xml的格式. 传统的配置文件ini已有被xml文件逐步代替的趋势,但对于简单的配置,ini文件还是有用武之地的.ini文件其实就是一个文本文件,它有固定的格式,节Section

  • Windows下MySQL5.6查找my.ini配置文件的方法

    记录一笔,防止以后忘了可以过来看看. 问题描述: 今天做个小实验需要修改MySQL的配置文件,我电脑上安装的是MySQL5.6,由于安装时间太久忘了安装在哪个目录下了,所以首先查了一下安装在本机上的MySQL的目录位置. 在DOS命令行窗口登录MySQL,输入如下命令查看MySQL的安装目录和数据存放目录,MySQL的配置文件就在数据存放目录下: 另外一种方法: 在"开始 → 所有程序 → MySQL"下面找到MySQL的命令行客户端工具,右键选择该命令行工具查看"属性&qu

  • PHP中操作ini配置文件的方法

    PHP操作ini配置文件 复制代码 代码如下: <?php//写ini文件function write_ini_file($assoc_arr, $path, $has_sections=FALSE){    $content = "";    if ($has_sections)    {        foreach ($assoc_arr as $key=>$elem)        {            $content .= "[".$ke

  • 易语言读取文本行数的方法

    易语言 取文本行数教程 本教材使用易语言自带支持库中的"分割文本"功能取出文本行数 1.新建一个窗口程序 添加一个编辑框组件 和按钮组件 2.在工作夹中把编辑框的 是否允许多行选择"真"和滚动条选择"纵向滚动条" 3.进入代码编辑窗口 写入一下代码 .版本 2 .程序集 窗口程序集_启动窗口 .子程序 _按钮1_被单击 .局部变量 分割文本, 文本型, , "0" 分割文本 = 分割文本 (编辑框1.内容, #换行符, ) 信

  • Shell脚本读取标准ini配置文件Demo

    ini DEMO 复制代码 代码如下: [TESTFTP] host=127.0.0.1 name=my pass=mylove type=ftp [TESTSSH] host=127.0.0.1 name=my pass=mylove type=ssh [END] Shell脚本: 复制代码 代码如下: initConf() { HOSTID=$1 CONF=$2 echo "----cat----" cat $CONF \\     | grep -v ^$ \\     | se

  • C# 读取指定路径配置文件的方法

    复制代码 代码如下: ExeConfigurationFileMap map = new ExeConfigurationFileMap();            map.ExeConfigFilename = @"F:\App1.config"; ;            Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 

随机推荐