C语言解析Ini格式文件
引用别人的博文: 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格式文件相关推荐
- Golang解析yaml格式文件
关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿! 作者:会飞的鲶鱼 链接:Golang解析yaml格式文件 - 简书 來源:简书 简书著作权归作者所有,任何形式的转载都请联系 ...
- C语言解析WAV音频文件
转载:http://www.cnblogs.com/LexMoon/p/wave-c.html 1.C语言解析WAV音频文件 代码地址: Github : https://github.com/Cas ...
- 第8.1.2解析mht格式文件
有人建议改造一下mhtifier.py就可以解析mht格式文件,它的示例没有告诉我,怎么验证.而且我改造也失败了,可能是我的水平有限. Python :解析 word 文档(前程无忧简历),这篇文章的 ...
- 【Ini格式文件】Ini格式文件的读写
前言 在实际工作中,常常需要读写ini格式的文件.在Gitee上找到一份开源的代码(MIT证书),其使用了文件读写的标准库函数,但我当前的嵌入式环境对文件读写的标准库函数的支持存在问题,当调用文件读写 ...
- 创建ogg文件 c语言,Ogg音频格式文件的样本构造(CVE-2018-5146)
原标题:Ogg音频格式文件的样本构造(CVE-2018-5146) *严正声明:本文仅限于技术讨论与分享,严禁用于非法途径 下面的所有分析都是在Firefox 59.0 32位上进行的.由于笔者是刚入 ...
- 【自动化测试】Python 读取 .ini 格式文件
大家应该接触过.ini格式的配置文件.配置文件就是把一些配置相关信息提取出去来进行单独管理,如果以后有变动只需改配置文件,无需修改代码.特别是后续做自动化的测试,需要拎出一部分配置信息,进行管理.比如 ...
- python ini文件 遍历_【自动化测试】Python 读取 .ini 格式文件
大家应该接触过.ini格式的配置文件.配置文件就是把一些配置相关信息提取出去来进行单独管理,如果以后有变动只需改配置文件,无需修改代码.特别是后续做自动化的测试,需要拎出一部分配置信息,进行管理.比如 ...
- 【R语言 数据读取】R语言读取sav格式文件
rm(list=ls()) gc()options(scipen = 200)#读取数据集 # haven包读取sav格式文件 library(haven)data <- read_sav(&q ...
- 在Go语言程序中使用gojson来解析JSON格式文件
gojson是快速解析json数据的一个golang包,你使用它可以快速的查找json内的数据 安装 1 go get github.com/widuu/gojson 使用简介 结构 type Js ...
最新文章
- UGUI_不添加摄像机解决UI与UI特效叠层
- 【VMware vSphere】VMware vSphere简单了解
- 遥感空间尺度转换技术(升尺度和降尺度)
- codeforces1435 D. Shurikens
- 计算机组成原理 北理,北京理工大学计算机组成原理期末复习.pdf
- 背包形动态规划 fjutoj2375 金明的预算方案
- Your Potential. Our Passion
- AndroidStudio安卓原生开发_Activity的启动模式standard和一部分singleTop启动模式---Android原生开发工作笔记86
- 保存文件_正确保存Zbrush文件
- [VC++]控制台程序窗口隐藏
- 360云盘修改存储目录技巧
- 重温Spring笔记3 - 依赖注入
- 【算法笔记】三种背包问题——背包 DP
- luogu P2706 巧克力
- RGB与CMYK颜色模式调色原理
- Unity Json 编写及读取
- 全球与中国切板刀市场深度研究分析报告
- The Shawshank Redemption-8
- oracle 删除定时任务 、查询定时任务、暂停定时任务、创建定时任务
- 用于光导耦合的倾斜光栅的分析
热门文章
- Fast Fourier Transform
- 前端开发面试题总结-代码篇
- SpringMVC中的设计模式
- 【ThinkingInC++】66、pointer Stash的使用
- Struts2之控制标签
- idea部署项目com.intellij.javaee.oss.admin.jmx.JmxAdminException-未使用最新版本的war包
- spyder中绘图无法显示负号_Python绘图--时序图
- python操作redis set_Python操作redis学习系列之(集合)set,redis set详解 (六)
- linux下vim 选择文本,删除,复制,粘贴
- linux图形环境小记