- 浏览: 75049 次
- 性别:
- 来自: 北京
这是一个解析配置文件的小程序,配置文件中只有“key=value”这样的项,面向于简单应用。网上的相关例子都很复杂,而且是可以解析section的,但是有时候配置文件并不需要这么复杂,很可能就几项。这样的文件还有个好处:在shell脚本里source一下,会把key值都设成变量,从而shell也可以操作这个文件。
初学,望指正。
file.h
#ifndef FILE_H_ #define FILE_H_ #ifdef __cplusplus extern "C" { #endif #define out //用来表示参数是输出型的 //只有两个接口 int read_conf_value(const char *key,out char *value,const char *file); int write_conf_value(const char *key,char *value,const char *file); #ifdef __cplusplus }; #endif #endif //end of FILE_H_
file.c
/* *读取配置文件 *配置文件有如下的形式 * IP=192.168.1.8 * NETMASK=255.255.255.0 * MAC=12:34:56:78:90:11 *支持#注释,但更新数据时会把注释全部去掉 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include "file.h" #ifdef __cplusplus extern "C" { #endif typedef struct item_t { char *key; char *value; }ITEM; /* *去除字符串右端空格 */ char *strtrimr(char *pstr) { int i; i = strlen(pstr) - 1; while (isspace(pstr[i]) && (i >= 0)) pstr[i--] = '\0'; return pstr; } /* *去除字符串左端空格 */ char *strtriml(char *pstr) { int i = 0,j; j = strlen(pstr) - 1; while (isspace(pstr[i]) && (i <= j)) i++; if (0<i) strcpy(pstr, &pstr[i]); return pstr; } /* *去除字符串两端空格 */ char *strtrim(char *pstr) { char *p; p = strtrimr(pstr); return strtriml(p); } /* *从配置文件的一行读出key或value,返回item指针 *line--从配置文件读出的一行 */ int get_item_from_line(char *line, out ITEM *item) { char *p = strtrim(line); int len = strlen(p); if(len <= 0){ return 1;//空行 } else if(p[0]=='#'){ return 2; }else{ char *p2 = strchr(p, '='); *p2++ = '\0'; item->key = (char *)malloc(strlen(p) + 1); item->value = (char *)malloc(strlen(p2) + 1); strcpy(item->key,p); strcpy(item->value,p2); } return 0;//查询成功 } int file_to_items(const char *file, out ITEM *items, out int *num) { char line[1024]; FILE *fp; fp = fopen(file,"r"); if(fp == NULL) return 1; int i = 0; while(fgets(line, 1023, fp)){ char *p = strtrim(line); int len = strlen(p); if(len <= 0){ continue; } else if(p[0]=='#'){ continue; }else{ char *p2 = strchr(p, '='); /*这里认为只有key没什么意义*/ if(p2 == NULL) continue; *p2++ = '\0'; items[i].key = (char *)malloc(strlen(p) + 1); items[i].value = (char *)malloc(strlen(p2) + 1); strcpy(items[i].key,p); strcpy(items[i].value,p2); i++; } } (*num) = i; fclose(fp); return 0; } /* *读取value */ int read_conf_value(const char *key,char *value,const char *file) { char line[1024]; FILE *fp; fp = fopen(file,"r"); if(fp == NULL) return 1;//文件打开错误 while (fgets(line, 1023, fp)){ ITEM item; get_item_from_line(line,&item); if(!strcmp(item.key,key)){ strcpy(value,item.value); fclose(fp); free(item.key); free(item.value); break; } } return 0;//成功 } int write_conf_value(const char *key,char *value,const char *file) { ITEM items[20];// 假定配置项最多有20个 int num;//存储从文件读取的有效数目 file_to_items(file, items, &num); int i; /*for(i=0;i<num;i++){ printf("key:%s,value:%s\n",items[i].key,items[i].value); }*/ //查找要修改的项 for(i=0;i<num;i++){ if(!strcmp(items[i].key, key)){ memset(items[i].value,0,sizeof(items[i].value)); strcpy(items[i].value,value); //printf("get value(write):%s\n",items[i].value); break; } } // 更新配置文件,应该有备份,下面的操作会将文件内容清除 FILE *fp; fp = fopen(file, "w"); if(fp == NULL) return 1; for(i=0;i<num;i++){ fprintf(fp,"%s=%s\n",items[i].key, items[i].value); //printf("%s=%s\n",items[i].key, items[i].value); } fclose(fp); //清除工作 for(i=0;i<num;i++){ free(items[i].key); free(items[i].value); } return 0; } #ifdef __cplusplus }; //end of extern "C" { #endif
main.c
#include <stdio.h> #include "file.h" int main(void) { char value[50]={0}; read_conf_value("MAC",value,"./net.conf"); printf("MAC_orignal:%s\n",value); write_conf_value("MAC","12:34:56:78:90:12","./net.conf"); read_conf_value("MAC",value,"./net.conf"); printf("MAC_new:%s\n",value); return 0; }
net.conf
IPADDR=192.168.1.6 NETMASK=255.255.255.0 GATEWAY=192.168.1.2 MAC=12:34:56:78:90:12
编译
gcc -o test main.c file.c
发表评论
-
排序算法---计数排序
2011-11-27 14:57 602#include <stdio.h> vo ... -
排序算法---归并排序
2011-11-26 19:33 740#include <stdio.h> vo ... -
排序算法---交换排序(冒泡排序、快速排序)
2011-11-26 19:32 699#include <stdio.h> vo ... -
排序算法---选择排序(简单插入排序、堆排序)
2011-11-26 19:31 643#include <stdio.h> vo ... -
排序算法---插入排序(简单排序、shell排序)
2011-11-26 19:29 643#include <stdio.h> vo ... -
删除字符串中的特定字符和重复字符
2011-11-26 13:45 660#include <stdio.h> vo ... -
Linux编程-多线程、同步和互斥(转载)
2011-11-14 15:27 1204http://www.cnblogs.com/skynet/a ... -
寻找字符串中的最大数字子串
2011-09-22 17:17 1513#include <stdio.h> int f ... -
删除子字符串
2011-09-21 15:27 599#include <stdio.h> #incl ... -
c语言随机数
2011-09-18 17:15 682#include <stdio.h> #i ... -
带头结点有序单链表的合并
2011-09-08 14:21 1178typedef int Item; typedef s ... -
链表逆序的递归/非递归算法
2011-09-01 23:37 1404/** *链表逆序的递归/非递归算法 */ # ... -
递归算法---字符串---全/部分组合和全排列
2011-08-30 23:01 1216#include <stdio.h> #i ... -
递归算法---0-1背包问题(面试宝典)
2011-08-28 21:11 1892/** *正整数n,m,从数列1、2、3、...、n中随 ... -
递归算法---字符串全组合(面试宝典)
2011-08-28 17:24 1249/** *求一字符串所有字串的组合 */ #i ... -
递归算法---求解多元一次方程
2011-08-28 10:38 1892/** * 求解x1+x2+x3+...+x10 = ... -
(zz)关于类的sizeof
2011-08-27 18:16 563http://blog.sina.com.cn/s/blog_ ... -
(zz)结构体字节对齐原则
2011-08-27 17:53 1575结构体默认的字节对齐一般满足三个准则: 结构体变量的首 ... -
list.h from linux-2.4
2011-08-25 09:59 602#ifndef _LIST_H_ #define _L ... -
The C Programming Lang (K&R) hash table
2011-08-25 09:52 929hash.h #include <stdio.h ...
相关推荐
MySQL配置文件解析主要涉及到MySQL服务器的参数调整,这些参数直接影响数据库的性能和稳定性。配置文件通常命名为`my.cnf`或`my.ini`,在不同的操作系统路径可能不同。以下是几个关键参数的解释: 1. `port`:指定...
6. **个性化体验**:通过深入解析配置文件,用户还可以实现一些高级功能,如自定义快捷键、添加个性化的兴趣点等,提升导航的个性化体验。 然而,配置文件的修改需要一定的技术基础,不恰当的修改可能导致软件运行...
总的来说,配置文件解析器是软件开发中的一个重要工具,它简化了对INI格式配置文件的处理,使得管理配置数据变得更为便捷。在给定的“iniconfig”库中,可能提供了更高级的功能,如错误处理、类型转换等,以适应不同...
Taro 是一个开源的多端开发框架,它允许开发者使用React语法编写代码,然后编译到微信小程序、H5、React Native等多个平台。Taro 3已经全面支持React Hooks,使得状态管理和组件复用更加便捷。 首先,让我们关注...
本篇文章将深入探讨如何利用Java来解析配置文件,同时借鉴Solr源码中的最佳实践。 首先,配置文件通常以XML、JSON或Properties格式存在。在Java中,解析这些文件有相应的库支持。例如,对于XML配置文件,我们可以...
为了编写配置文件,你需要提供一个接口,允许用户设置和获取配置项。这可以通过一组函数实现,比如`set_config_value()`和`get_config_value()`。 此外,考虑到错误处理,需要在读取和解析过程中捕获可能的异常,如...
这样的工具对于开发者或者对系统有深入需求的用户来说非常有价值,他们可以通过解析配置文件,了解系统的工作原理,定制个性化设置,或者解决可能出现的问题。 "CarelandCfgTools.ini" 则是一个初始化配置文件,...
这可以通过在主函数中调用一个配置读取函数来完成,该函数可以使用上述提到的库来解析文件,并将结果存储在结构体、类实例或全局变量中。 6. **错误处理和兼容性**:在处理配置文件时,应考虑到错误处理,如文件不...
本文主要讲解了 Java 中如何读取 XML 配置文件,并对 XML 解析器进行了分类,分别介绍了 DOM 和 SAX 两种解析方式的特点和使用场景,并提供了一个使用 SAX 解析器读取 XML 配置文件的示例程序。 在 Java 开发中,...
"凯立德2012配置文件解析与参考.exe"是这个工具的执行程序,用户可以通过运行这个文件来启动修改器。这个版本可能针对的是凯立德2012版的配置文件,因此在使用时需要确保你的凯立德导航软件是对应版本,否则可能会...
- **bdParse.swan**:这可能是针对百度智能小程序特性的配置文件或扩展代码。 - **emojis**:这个文件可能包含了表情符号的处理逻辑,帮助解析HTML中的表情符号并显示在百度小程序中。 4. **使用方法**: 开发者...
在微信小程序开发中,富文本解析是一个常见的需求,主要用于处理包含HTML或Markdown格式的文本内容。富文本可以包含各种格式的元素,如字体、颜色、链接、图片等,使得内容展示更加丰富多彩。本文将深入探讨如何在...
"Go-mini-golang包"就是针对这种需求设计的一个小型库,它专门用于解析ini风格的配置文件。本文将详细介绍这个库的使用方法、核心功能以及其在实际项目中的应用。 首先,让我们理解什么是ini文件。INI文件是一种...
总的来说,这个 ini 配置文件解析工具提供了一个轻量级的解决方案,适用于需要快速读写 ini 文件的项目。它的源码简洁明了,方便自定义和扩展,对于初学者来说也是一个了解配置文件解析和C++编程的好例子。通过深入...
为了解决这个问题,开发者可以借助“mp-html”组件,它是一个专门为微信小程序设计的富文本解析库,能够有效地解析和展示各种HTML样式,确保内容的完整性。 本文将深入讲解如何使用“mp-html”在小程序中实现富文本...
微信小程序的源码通常由多个文件组成,包括JSON配置文件、WXML结构文件、WXSS样式文件和JS逻辑文件。JSON文件用于定义页面配置,WXML文件类似HTML,负责页面结构,WXSS类似于CSS,处理样式,JS文件则处理业务逻辑和...
6. **小程序源码结构**:一个标准的小程序项目通常包括wxml、wxss、js和json四种类型的文件。wxml负责界面布局,wxss处理样式,js处理逻辑,json定义页面配置。根据压缩包中的文件列表,部分js文件可能代表不同的...
本项目提供了一个简单的实现,使开发者能够轻松地在VB程序中处理配置文件。 首先,我们要了解配置文件通常是什么。在Windows环境中,配置文件通常是INI或XML格式,它们包含了应用程序运行时所需的各种参数。VB中的...
标题中的“解析XML和Propertites配置文件”指的是在软件开发中处理两种常见的配置文件格式。XML(eXtensible Markup ...对于大型项目,正确解析和管理配置文件至关重要,因为这直接影响到程序的运行效果和可配置性。