#include <stdio.h>
#include <string.h> /*
* 函数名: GetIniKeyString
* 入口参数: title
* 配置文件中一组数据的标识
* key
* 这组数据中要读出的值的标识
* filename
* 要读取的文件路径
* 返回值: 找到需要查的值则返回正确结果
* 否则返回NULL
*/
char *GetIniKeyString(char *title,char *key,char *filename)
{
FILE *fp;
int flag = ;
char sTitle[], *wTmp;
static char sLine[]; sprintf(sTitle, "[%s]", title);
if(NULL == (fp = fopen(filename, "r"))) {
perror("fopen");
return NULL;
} while (NULL != fgets(sLine, , fp)) {
// 这是注释行
if ( == strncmp("//", sLine, )) continue;
if ('#' == sLine[]) continue; wTmp = strchr(sLine, '=');
if ((NULL != wTmp) && ( == flag)) {
if ( == strncmp(key, sLine, wTmp-sLine)) { // 长度依文件读取的为准
sLine[strlen(sLine) - ] = '\0';
fclose(fp);
return wTmp + ;
}
} else {
if ( == strncmp(sTitle, sLine, strlen(sLine) - )) { // 长度依文件读取的为准
flag = ; // 找到标题位置
}
}
}
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 = ;
char sLine[], sTitle[], *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, , fpr)) {
if ( != flag) { // 如果找到要修改的那一行,则不会执行内部的操作
wTmp = strchr(sLine, '=');
if ((NULL != wTmp) && ( == flag)) {
if ( == strncmp(key, sLine, wTmp-sLine)) { // 长度依文件读取的为准
flag = ;// 更改值,方便写入文件
sprintf(wTmp + , "%s\n", val);
}
} else {
if ( == strncmp(sTitle, sLine, strlen(sLine) - )) { // 长度依文件读取的为准
flag = ; // 找到标题位置
}
}
} 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[];
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", , "config.ini");
return ;
}

这是我自己创建的一个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
==========================================================================================
http://blog.csdn.net/niha1993825jian/article/details/41086403

C语言实现 读取写入ini文件实现(转)的更多相关文章

  1. 【WPS】表格使用VBA宏编程写入ini文件实现软件多语言

    前言:公司软件最近在做多语言版本,而又来一个西班牙文版本的,之前已经做过中文版本,英文版本和法文版本,之前是同事做的,现在安排我做,之前的做法,使用wps表格,翻译好,然后一个一个复制粘贴到ini文件 ...

  2. MFC写入.ini文件的策略

    在使用WritePrivateProfileString的时候, 如果前两个参数已经在INI文件中存在,那该函数的作用就是修改键值,即楼主说的覆盖 如果第一个参数存在,第二个参数不存在,那作用是在IN ...

  3. boost::property_tree读取解析ini文件--推荐

    boost::property_tree读取解析ini文件 #include "stdafx.h" #include <iostream> #include <b ...

  4. C语言实现<读取>和<写入> *.ini文件(转)

    原地址:https://blog.csdn.net/niha1993825jian/article/details/41086403 #include <stdio.h> #include ...

  5. 用C#读取,写入ini文件

    [DllImport("kernel32.dll")] private static extern bool WritePrivateProfileString(string se ...

  6. C语言读取写入CSV文件 [一]基础篇

    本系列文章目录 [一] 基础篇 [二] 进阶篇--写入CSV [三] 进阶篇--读取CSV 什么是CSV? CSV 是一种以纯文本形式存储的表格数据,具体介绍如下(来自维基百科): 逗号分隔值(Com ...

  7. C#中选中指定文件并读取类似ini文件的内容

    一.背景 由于项目中需要去读取设备的配置信息,配置文件的内容和INI配置文件的格式类似,所以可以按照INI文件的方式来处理.涉及如何打开一个文件,获取打开的文件的路径问题,并读取选中的文件里边的内容. ...

  8. C++简单使用Jsoncpp来读取写入json文件

    一.源码编译 C++操作json字符串最好的库应该就是jsoncpp了,开源并且跨平台.它可以从这里下载. 下载后将其解压到任意目录,它默认提供VS2003和VS2010的工程文件,使用VS2010可 ...

  9. C++ 中使用boost::property_tree读取解析ini文件

    boost 官网 http://www.boost.org/ 下载页面 http://sourceforge.net/projects/boost/files/boost/1.53.0/ 我下载的是  ...

随机推荐

  1. 牛客网——G送分了(py)

    链接:https://www.nowcoder.net/acm/contest/74/G来源:牛客网 题目描述 杭州人称傻乎乎的人为62,而嘟嘟家这里没有这样的习俗. 相比62,他那里的人更加讨厌数字 ...

  2. lvs+keepalived+bind实现负载均衡高可用智能dns【转】

    转:https://www.cnblogs.com/mikeluwen/p/7068356.html 整体架构: 1.IP地址规划: Dns1:172.28.0.54 Dns2:172.28.0.55 ...

  3. 【hive】count() count(if) count(distinct if) sum(if)的区别

    表名: user_active_day (用户日活表) 表内容: user_id(用户id)   user_is_new(是否新用户 1:新增用户 0:老用户) location_city(用户所在地 ...

  4. 安装wamp后,127.0.0.1可以访问,localhost不能访问

    今天安装wamp后,127.0.0.1可以访问,localhost不能访问,出现 “error You don't have permission to access”的错误, 网上查了下,很多方法都 ...

  5. [批处理]NetstatFilter快速查找端口被占用问题

    前言 准确的说,他是一个网络连接端口查看器,可以根据进程查端口,也可以根据端口查进程.期初是因在使用Fiddler的时候发现无法启动,提示端口被占用,但是由不知道用什么方法才能找到是哪个程序占用的Fi ...

  6. HBase查询优化——持续更新

    Scan:setBatch,setCaching,setCacheBlocks public void setBatch(int batch) public void setCaching(int c ...

  7. windows下 两个版本的JDK环境变量进行切换 MARK

    我们平时在window上做开发的时候,可能需要同时开发两个甚至多个项目,有时不同的项目对JDK的版本要求有区别,为了简化操作,我们可以通过批处理文件来完成环境变量切换的任务.使用方法:阅读代码我们就会 ...

  8. Java第七次作业--图形用户界面

    Deadline: 2017-5-11 23:00 一.学习要点 认真看书并查阅相关资料,掌握以下内容: 了解GUI开发的相关原理和技巧 熟悉Swint组件的使用 理解事件处理模型 二.作业要求 发布 ...

  9. BI系统之统计图表的绘制[后端实现]

    因为在开发内部BI系统中需要画出统计图表,我选了Jpgraph 开源绘图工具实现需求. 之前实现过需求,没想到这次又花了很多时间回忆,各种搜索,真的是好记性不如烂笔头, 不会总结的人没有未来啊. 常用 ...

  10. DELL E7240超极本

    一.图片展示 1.整体图 2.扩展坞的后卡槽附带挡板 3.电源线 4.边框指示灯 5.平躺展示摄像头 二.参数配置 1.i5的 2.i7的 3.手写 处理器:英特尔四代处理器    i7-4600U双 ...