引用别人的博文: http://www.open-open.com/lib/view/open1402278076447.html

可以解析 INI 格式的字符串、解析文件、保存到文件。

下面是头文件:

  1 #ifndef INI_PARSER_H
  2 #define INI_PARSER_H
  3 #ifdef __cplusplus
  4 extern "C" {
  5 #endif
  6 struct tag_value_list;
  7
  8 struct ini_parser {
  9     struct tag_value_list * keyvalues;
 10     int (*parse_file)(struct ini_parser *, const char * file);
 11     int (*parse_string)(struct ini_parser *, const char *text);
 12     char * (*value)(struct ini_parser *, const char * key);
 13     void (*set_value)(struct ini_parser *, const char * key, const char * value);
 14     void (*remove)(struct ini_parser *, const char *key);
 15     int (*save_to_file)(struct ini_parser *, const char * file);
 16 };
 17
 18 struct ini_parser * new_ini_parser();
 19 void delete_ini_parser(struct ini_parser *);
 20
 21 #ifdef __cplusplus
 22 }
 23 #endif
 24 #endif // INI_PARSER_H
 25 下面是源文件:
 26 #include "ini_parser.h"
 27 #include <stdio.h>
 28 #include <string.h>
 29 #include "tag_value.h"
 30
 31 static struct tag_value_pair * parse_line(char *line, int len)
 32 {
 33     struct tag_value_pair * pair = 0;
 34     int count = 0;
 35     char * p = line;
 36     char * end = 0;
 37     char * start = line;
 38     if(!p) return 0;
 39     while(*p == ' ') p++;
 40
 41
 42     /*blank line*/
 43     if(p - line == len ||
 44             *p == '\r' ||
 45             *p == '\n' ||
 46             *p == '\0') return 0;
 47
 48     /*do not support group*/
 49     if(*p == '[') return 0;
 50     /*comments*/
 51     if(*p == '#') return 0;
 52
 53     /* extract key */
 54     start = p;
 55     end = line + len;
 56     while(*p != '=' && p!= end) p++;
 57     if(p == end)
 58     {
 59         /* none '=' , invalid line */
 60         return 0;
 61     }
 62     end = p - 1;
 63     while(*end == ' ') end--; /* skip blank at the end */
 64     count = end - start + 1;
 65
 66     pair = new_tag_value_pair();
 67     pair->szTag = malloc(count + 1);
 68     strncpy(pair->szTag, start, count);
 69     pair->szTag[count] = 0;
 70
 71     /* extract value */
 72     p++;
 73     end = line + len; /* next pos of the last char */
 74     while( *p == ' ' && p != end) p++;
 75     if(p == end)
 76     {
 77         delete_tag_value_pair(pair);
 78         return 0;
 79     }
 80     start = p;
 81     end--; /* to the last char */
 82     if(*end == '\n') { *end = 0; end--; }
 83     if(*end == '\r') { *end = 0; end--; }
 84     count = end - start + 1;
 85     if(count > 0)
 86     {
 87         pair->szValue = malloc(count + 1);
 88         strncpy(pair->szValue, start, count);
 89         pair->szValue[count] = 0;
 90     }
 91
 92     /* release empty key-value pair */
 93     if(!pair->szValue)
 94     {
 95         delete_tag_value_pair(pair);
 96         return 0;
 97     }
 98
 99     return pair;
100 }
101
102 static int _parse_file(struct ini_parser * ini, const char *file){
103     FILE * fp = fopen(file, "r");
104     if(fp)
105     {
106         struct tag_value_pair * pair = 0;
107         char buf[1024] = {0};
108         while(fgets(buf, 1024, fp))
109         {
110             pair = parse_line(buf, strlen(buf));
111             if(pair)
112             {
113                 ini->keyvalues->add(ini->keyvalues, pair);
114             }
115         }
116         fclose(fp);
117         return ini->keyvalues->size;
118     }
119     return -1;
120 }
121
122 static int _parse_text(struct ini_parser * ini, const char * text){
123     char *p = text;
124     char * start = 0;
125     struct tag_value_pair * pair = 0;
126     if(!text) return -1;
127
128     while(1)
129     {
130         start = p;
131         while(*p != '\n' && *p != '\0' )p++;
132         if(*p == '\0') break;
133
134         pair = parse_line(start, p - start);
135         if(pair) ini->keyvalues->add(ini->keyvalues, pair);
136
137         p++;
138     }
139
140     return ini->keyvalues->size;
141 }
142
143 static char * _value(struct ini_parser * ini, const char * key){
144     struct tag_value_pair * pair = ini->keyvalues->find_by_tag(ini->keyvalues, key);
145     if(pair) return pair->szValue;
146     return 0;
147 }
148
149 static void _set_value(struct ini_parser * ini, const char * key, const char *value){
150     struct tag_value_pair * pair = ini->keyvalues->find_by_tag(ini->keyvalues, key);
151     if(pair)
152     {
153         if(pair->szValue) free(pair->szValue);
154         pair->szValue = strdup(value);
155     }
156     else
157     {
158         ini->keyvalues->add(ini->keyvalues, make_tag_value_pair(key, value));
159     }
160 }
161
162 static void _remove(struct ini_parser * ini, const char * key){
163     struct tag_value_pair * pair = ini->keyvalues->find_by_tag(ini->keyvalues, key);
164     if(pair)ini->keyvalues->remove(ini->keyvalues, pair);
165 }
166
167 static void write_keyvalue(struct tag_value_pair * pair, FILE *fp)
168 {
169     fputs(pair->szTag, fp);
170     fputc('=', fp);
171     fputs(pair->szValue, fp);
172     fputc('\n', fp);
173 }
174
175 static int _save_to_file(struct ini_parser * ini, const char * file){
176     if(ini->keyvalues->size > 0)
177     {
178         FILE * fp = fopen(file, "w");
179         if(fp)
180         {
181             struct tag_value_pair * pair = ini->keyvalues->head;
182             while(pair != ini->keyvalues->tail)
183             {
184                 write_keyvalue(pair, fp);
185                 pair = pair->next;
186             }
187
188             if(pair)write_keyvalue(pair, fp);
189
190             fclose(fp);
191             return 0;
192         }
193     }
194     return -1;
195 }
196
197 struct ini_parser * new_ini_parser(){
198     struct ini_parser * ini = (struct ini_parser*)malloc(sizeof(struct ini_parser));
199     ini->keyvalues = new_tag_value_list();
200     ini->parse_file = _parse_file;
201     ini->parse_string = _parse_text;
202     ini->value = _value;
203     ini->set_value = _set_value;
204     ini->remove = _remove;
205     ini->save_to_file = _save_to_file;
206     return ini;
207 }
208
209 void delete_ini_parser(struct ini_parser *ini){
210     if(ini)
211     {
212         delete_tag_value_list(ini->keyvalues);
213         free(ini);
214     }
215 }
216     测试代码:
217 #include "util/ini_parser.h"
218 #include "ini_test.h"
219 #include <stdio.h>
220 #include <assert.h>
221
222 static char * g_szIniString = "#abc\nfirst=2\nsecond\nname=charli  zhang \n";
223
224 static void ini_parser_test_string()
225 {
226     struct ini_parser * ini = new_ini_parser();
227     int size = ini->parse_string(ini, g_szIniString);
228
229     assert( size > 0);
230     assert( ini->value(ini, "second") == 0 );
231     assert( ini->value(ini, "abc") == 0);
232     assert( ini->value(ini, "name") != NULL );
233     assert( ini->value(ini, "first") != NULL);
234
235     printf("ini string: %s\n", g_szIniString);
236     printf("key-value pairs count = %d\n", size);
237     printf("key \'name\'', value = %s\n", ini->value(ini, "name"));
238     printf("key \'first\'', value = %s\n", ini->value(ini, "first"));
239
240     ini->set_value(ini, "baidu", "hahaha");
241     ini->save_to_file(ini, "write.conf");
242
243     ini->remove(ini, "first");
244     ini->save_to_file(ini, "write2.conf");
245
246     delete_ini_parser(ini);
247 }
248
249 static void ini_parser_test_file()
250 {
251     struct ini_parser * ini = new_ini_parser();
252     int size = ini->parse_file(ini, "test.conf");
253
254     assert( size > 0);
255     assert( ini->value(ini, "second") == 0 );
256     assert( ini->value(ini, "abc") == 0);
257     assert( ini->value(ini, "name") != NULL );
258     assert( ini->value(ini, "first") != NULL);
259
260     printf("ini string: %s\n", g_szIniString);
261     printf("key-value pairs count = %d\n", size);
262     printf("key \'name\'', value = %s\n", ini->value(ini, "name"));
263     printf("key \'first\'', value = %s\n", ini->value(ini, "first"));
264     printf("key \'baidu\'', value = %s\n", ini->value(ini, "baidu"));
265
266     delete_ini_parser(ini);
267 }
268
269 void ini_parser_test()
270 {
271     ini_parser_test_string();
272     ini_parser_test_file();
273 }

转载于:https://www.cnblogs.com/yyx1-1/p/6223308.html

C语言解析Ini格式文件相关推荐

  1. Golang解析yaml格式文件

    关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿! 作者:会飞的鲶鱼 链接:Golang解析yaml格式文件 - 简书 來源:简书 简书著作权归作者所有,任何形式的转载都请联系 ...

  2. C语言解析WAV音频文件

    转载:http://www.cnblogs.com/LexMoon/p/wave-c.html 1.C语言解析WAV音频文件 代码地址: Github : https://github.com/Cas ...

  3. 第8.1.2解析mht格式文件

    有人建议改造一下mhtifier.py就可以解析mht格式文件,它的示例没有告诉我,怎么验证.而且我改造也失败了,可能是我的水平有限. Python :解析 word 文档(前程无忧简历),这篇文章的 ...

  4. 【Ini格式文件】Ini格式文件的读写

    前言 在实际工作中,常常需要读写ini格式的文件.在Gitee上找到一份开源的代码(MIT证书),其使用了文件读写的标准库函数,但我当前的嵌入式环境对文件读写的标准库函数的支持存在问题,当调用文件读写 ...

  5. 创建ogg文件 c语言,Ogg音频格式文件的样本构造(CVE-2018-5146)

    原标题:Ogg音频格式文件的样本构造(CVE-2018-5146) *严正声明:本文仅限于技术讨论与分享,严禁用于非法途径 下面的所有分析都是在Firefox 59.0 32位上进行的.由于笔者是刚入 ...

  6. 【自动化测试】Python 读取 .ini 格式文件

    大家应该接触过.ini格式的配置文件.配置文件就是把一些配置相关信息提取出去来进行单独管理,如果以后有变动只需改配置文件,无需修改代码.特别是后续做自动化的测试,需要拎出一部分配置信息,进行管理.比如 ...

  7. python ini文件 遍历_【自动化测试】Python 读取 .ini 格式文件

    大家应该接触过.ini格式的配置文件.配置文件就是把一些配置相关信息提取出去来进行单独管理,如果以后有变动只需改配置文件,无需修改代码.特别是后续做自动化的测试,需要拎出一部分配置信息,进行管理.比如 ...

  8. 【R语言 数据读取】R语言读取sav格式文件

    rm(list=ls()) gc()options(scipen = 200)#读取数据集 # haven包读取sav格式文件 library(haven)data <- read_sav(&q ...

  9. 在Go语言程序中使用gojson来解析JSON格式文件

    gojson是快速解析json数据的一个golang包,你使用它可以快速的查找json内的数据 安装 1 go get github.com/widuu/gojson 使用简介 结构 type Js ...

最新文章

  1. UGUI_不添加摄像机解决UI与UI特效叠层
  2. 【VMware vSphere】VMware vSphere简单了解
  3. 遥感空间尺度转换技术(升尺度和降尺度)
  4. codeforces1435 D. Shurikens
  5. 计算机组成原理 北理,北京理工大学计算机组成原理期末复习.pdf
  6. 背包形动态规划 fjutoj2375 金明的预算方案
  7. Your Potential. Our Passion
  8. AndroidStudio安卓原生开发_Activity的启动模式standard和一部分singleTop启动模式---Android原生开发工作笔记86
  9. 保存文件_正确保存Zbrush文件
  10. [VC++]控制台程序窗口隐藏
  11. 360云盘修改存储目录技巧
  12. 重温Spring笔记3 - 依赖注入
  13. 【算法笔记】三种背包问题——背包 DP
  14. luogu P2706 巧克力
  15. RGB与CMYK颜色模式调色原理
  16. Unity Json 编写及读取
  17. 全球与中国切板刀市场深度研究分析报告
  18. The Shawshank Redemption-8
  19. oracle 删除定时任务 、查询定时任务、暂停定时任务、创建定时任务
  20. 用于光导耦合的倾斜光栅的分析

热门文章

  1. Fast Fourier Transform
  2. 前端开发面试题总结-代码篇
  3. SpringMVC中的设计模式
  4. 【ThinkingInC++】66、pointer Stash的使用
  5. Struts2之控制标签
  6. idea部署项目com.intellij.javaee.oss.admin.jmx.JmxAdminException-未使用最新版本的war包
  7. spyder中绘图无法显示负号_Python绘图--时序图
  8. python操作redis set_Python操作redis学习系列之(集合)set,redis set详解 (六)
  9. linux下vim 选择文本,删除,复制,粘贴
  10. linux图形环境小记