.ini 文件格式如下:

[section1]

key1=value

keyn=value

[section2]

key1=value

keyn=value

代码如下:

#define _PARAM_GLOBALS_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "userlib.h"
#include "paramConfig.h"#define SECTION_MAX_LEN 256#define STRVALUE_MAX_LEN 256#define LINE_CONTENT_MAX_LEN 256
//read value from .ini
void IniReadValue(char* section, char* key, char* val, const char* file)
{FILE* fp;int i = 0;int lineContentLen = 0;int position = 0;char lineContent[LINE_CONTENT_MAX_LEN];bool bFoundSection = false;bool bFoundKey = false;fp = fopen(file, "r");if(fp == NULL){printf("%s: Opent file %s failed.\n", __FILE__, file);return;}while(feof(fp) == 0){memset(lineContent, 0, LINE_CONTENT_MAX_LEN);fgets(lineContent, LINE_CONTENT_MAX_LEN, fp);if((lineContent[0] == ';') || (lineContent[0] == '\0') || (lineContent[0] == '\r') || (lineContent[0] == '\n')){continue;}//check sectionif(strncmp(lineContent, section, strlen(section)) == 0){bFoundSection = true;//printf("Found section = %s\n", lineContent);while(feof(fp) == 0){memset(lineContent, 0, LINE_CONTENT_MAX_LEN);fgets(lineContent, LINE_CONTENT_MAX_LEN, fp);//check keyif(strncmp(lineContent, key, strlen(key)) == 0){bFoundKey = true;lineContentLen = strlen(lineContent);//find valuefor(i = strlen(key); i < lineContentLen; i++){if(lineContent[i] == '='){position = i + 1;break;}}if(i >= lineContentLen) break;strncpy(val, lineContent + position, strlen(lineContent + position));lineContentLen = strlen(val);for(i = 0; i < lineContentLen; i++){if((lineContent[i] == '\0') || (lineContent[i] == '\r') || (lineContent[i] == '\n')){val[i] = '\0';break;}}  }else if(lineContent[0] == '[') {break;}}break;}}if(!bFoundSection){printf("No section = %s\n", section);}else if(!bFoundKey){printf("No key = %s\n", key);}fclose(fp);
}int readStringValue(const char* section, char* key, char* val, const char* file)
{char sect[SECTION_MAX_LEN];//printf("section = %s, key = %s, file = %s\n", section, key, file);if (section == NULL || key == NULL || val == NULL || file == NULL){printf("%s: input parameter(s) is NULL!\n", __func__);return READ_STR_ERR;}memset(sect, 0, SECTION_MAX_LEN);sprintf(sect, "[%s]", section);//printf("reading value...\n");IniReadValue(sect, key, val, file);return READ_STR_OK;
}int readIntValue(const char* section, char* key, const char* file)
{char strValue[STRVALUE_MAX_LEN];memset(strValue, '\0', STRVALUE_MAX_LEN);if(readStringValue(section, key, strValue, file) != READ_STR_OK){printf("%s: error", __func__);return 0;}return(atoi(strValue));
}void IniWriteValue(const char* section, char* key, char* val, const char* file)
{FILE* fp;int i = 0, n = 0, err = 0;int lineContentLen = 0;int position = 0;char lineContent[LINE_CONTENT_MAX_LEN];char strWrite[LINE_CONTENT_MAX_LEN];bool bFoundSection = false;bool bFoundKey = false;memset(lineContent, '\0', LINE_CONTENT_MAX_LEN);memset(strWrite, '\0', LINE_CONTENT_MAX_LEN);n = sprintf(strWrite, "%s=%s\n", key, val);fp = fopen(file, "r+");if(fp == NULL){printf("%s: Opent file %s failed.\n", __FILE__, file);return;}while(feof(fp) == 0){memset(lineContent, 0, LINE_CONTENT_MAX_LEN);fgets(lineContent, LINE_CONTENT_MAX_LEN, fp);if((lineContent[0] == ';') || (lineContent[0] == '\0') || (lineContent[0] == '\r') || (lineContent[0] == '\n')){continue;}//check sectionif(strncmp(lineContent, section, strlen(section)) == 0){bFoundSection = true;while(feof(fp) == 0){memset(lineContent, 0, LINE_CONTENT_MAX_LEN);fgets(lineContent, LINE_CONTENT_MAX_LEN, fp);//check keyif(strncmp(lineContent, key, strlen(key)) == 0){bFoundKey = true;printf("%s: %s=%s\n", __func__, key, val);fseek(fp, (0-strlen(lineContent)),SEEK_CUR);err = fputs(strWrite, fp);if(err < 0){printf("%s err.\n", __func__);}break; }else if(lineContent[0] == '[') {break;}}break;}}if(!bFoundSection){printf("No section = %s\n", section);}else if(!bFoundKey){printf("No key = %s\n", key);}fclose(fp);
}int writeStringVlaue(const char* section, char* key, char* val, const char* file)
{char sect[SECTION_MAX_LEN];//printf("section = %s, key = %s, file = %s\n", section, key, file);if (section == NULL || key == NULL || val == NULL || file == NULL){printf("%s: input parameter(s) is NULL!\n", __func__);return READ_STR_ERR;}memset(sect, '\0', SECTION_MAX_LEN);sprintf(sect, "[%s]", section);IniWriteValue(sect, key, val, file);
}int writeIntValue(const char* section, char* key, int val, const char* file)
{char strValue[STRVALUE_MAX_LEN];memset(strValue, '\0', STRVALUE_MAX_LEN);sprintf(strValue, "%-4d", val);writeStringVlaue(section, key, strValue, file);}

在 writeIntValue() 函数中 sprintf(strValue, “%-4d”, val); 做了对齐及位宽处理,主要是因为避免不同的位数数据写入出现错误。目前还没想到比较好的解决方案,暂时就这样处理了。

linux c 读写 ini 配置文件相关推荐

  1. python读取配置文件 分段_Python3读写ini配置文件的示例

    ini文件即Initialization File初始化文件,在应用程序及框架中常作为配置文件使用,是一种静态纯文本文件,使用记事本即可编辑. 配置文件的主要功能就是存储一批变量和变量值,在ini文件 ...

  2. C# 读写ini配置文件demo

    INI就是扩展名为"INI"的文件,其实他本身是个文本文件,可以用记事本打工,主要存放的是用户所做的选择或系统的各种参数. INI文件其实并不是普通的文本文件.它有自己的结构.由若 ...

  3. C/C++ ini配置文件的格式及如何读写ini配置文件

    一.ini配置文件的格式 为什么要用INI文件?如果我们程序没有任何配置文件时,这样的程序对外是全封闭的,一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,这样很不好,所以要用配置文件,让程序 ...

  4. C# 读写ini配置文件

     C# 读写ini配置文件 一.简述  记--c#通过调用系统api接口进行简单读写ini配置文件. 例子打包:外链:https://wwa.lanzoui.com/b0c9nm3pa 密码:8maq ...

  5. C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()

    转自:http://hi.baidu.com/andywangcn/blog/item/10ba730f48160eeb37d122e9.html 配置文件中经常用到ini文件,在VC中其函数分别为: ...

  6. linux ini文件,Shell script - Linux下解析ini配置文件

    导语Linux 有时候需要统计多台主机上面的数据,比如合并N多主机的日志,然后进行下一步的分析.这个时候如果直接把所有主机IP写死到脚本中的话,下次新增一台主机,就需要再去修改脚本,如果涉及到多个脚本 ...

  7. 【转载】C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()

    配置文件中经常用到ini文件,在VC中其函数分别为: #include <Windows.h> //wince,WMobile.ppc不支持这几个函数 写入.ini文件:bool Writ ...

  8. 批处理之读写ini配置文件

    1. 简介 批处理并没有直接读写ini文件的功能.所以只能通过读取文件内容分析比较来找到相应段名.键名对应位置,然后提取相应字符串来做为读.写则是找到键名对应的内容,然后进行替换,重新新的文件然后覆盖 ...

  9. 【Y忍冬草】QT读写ini配置文件

    文章目录 1.ini文件格式 2. ini配置文件的读写.删除 3. 结果 4.源码下载  在我们进行软件系统开始时,对于一些参数我们需要进行配置,这时我们就会用ini类型的配置文件.其实我们在很多软 ...

  10. QT中如何读写ini配置文件

    本文首发于「3D视觉工坊」知识星球. 如图1所示,我们需要在QT界面中实现手动读取参数存放的位置,那么我们该如何做呢? 方法:读取ini格式的配置文件,实现路径的写入与读取. 第一步:界面构造函数中, ...

最新文章

  1. 计算机程序设计员_第二届北京大工匠计算机程序设计员、网络与信息安全管理员挑战赛:一场互联网“战场”的巅峰对决...
  2. ECCV 2018 | Bi-box行人检测:‘行人遮挡’为几何?
  3. Android SqliteManager 源码
  4. Date类(日期时间类)219
  5. docker的swarm介绍
  6. 软件测试—软件测试基础知识—测试用例设计的方法判定表和因果图
  7. 嵌入式系统——RS232和RS449
  8. 使用Timer实现异步调用方法
  9. mysql日期查询索引_mysql – 如何为这种查询索引两个日期列
  10. 【WSN通信】基于matlab粒子群算法改进能量均衡高效WSN LEACH协议【含Matlab源码 1562期】
  11. ABeam Insight | 德硕智能制造系列(1):智能制造概览(上)
  12. 搜狗输入法中文状态下,打出来还是英文按住键盘Ctrl+shift+E就可以了
  13. Python高效实现滑块验证码自动操纵
  14. Webpack配置区分开发环境和生产环境
  15. 固网应用程序请重启计算机,固网USB打印服务器安装设置指引_固网 HP-1008MFP_办公打印评测试用-中关村在线...
  16. 工厂系列系统之 MES 系统 3 核心模块BOM管理
  17. hpp.h与.h的区别
  18. Grizzly和Netty以及Mina简单性能对比
  19. Spring Boot 2.x 事务处理(一篇长文让你读懂什么是隔离级别和传播行为)
  20. linux 限制带宽命令,怎样在 Linux 中限制网络带宽使用

热门文章

  1. 淘晶驰串口屏常见问题及解决方法
  2. 网管随笔02---【爱普生R230打印机清零大作战】
  3. bbs.FISHC.com//python_文件
  4. 《算法竞赛入门经典》————竖式问题
  5. 漏洞补丁:漏洞命名(CVE和CNNVD)及补丁查找
  6. 用python模拟微信支付_微信app支付python代码实现
  7. 实现:首页--上一页--下一页--末页的简单分页实现
  8. 2021北京地区高考成绩排名查询,2021年北京理科高考成绩排名一分一段表,北京理科成绩排名查询...
  9. Qimage像素级操作
  10. python:植物大战僵尸源代码