1. #cat bb.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <assert.h>
  6. #include <errno.h>
  7. #define KEYVALLEN 100
  8. /* Delete left side blank */
  9. char * l_trim(char * szOutput, const char *szInput)
  10. {
  11. assert(szInput != NULL);
  12. assert(szOutput != NULL);
  13. assert(szOutput != szInput);
  14. for(NULL; *szInput != '\0' && isspace(*szInput); ++szInput){
  15. ;
  16. }
  17. return strcpy(szOutput, szInput);
  18. }
  19. /* Delete right side blank */
  20. char *r_trim(char *szOutput, const char *szInput)
  21. {
  22. char *p = NULL;
  23. assert(szInput != NULL);
  24. assert(szOutput != NULL);
  25. assert(szOutput != szInput);
  26. strcpy(szOutput, szInput);
  27. for(p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p){
  28. ;
  29. }
  30. *(++p) = '\0' ;
  31. return szOutput;
  32. }
  33. /* Delete both side blank */
  34. char * a_trim(char * szOutput, const char * szInput)
  35. {
  36. char *p = NULL;
  37. assert(szInput != NULL);
  38. assert(szOutput != NULL);
  39. l_trim(szOutput, szInput);
  40. for (p = szOutput + strlen(szOutput) - 1;p >= szOutput && isspace(*p); --p){
  41. ;
  42. }
  43. *(++p) = '\0';
  44. return szOutput;
  45. }
  46. int GetProfileString(char *profile, char *AppName, char *KeyName, char *KeyVal )
  47. {
  48. char appname[32],keyname[32];
  49. char *buf,*c;
  50. char buf_i[KEYVALLEN], buf_o[KEYVALLEN];
  51. FILE *fp;
  52. int found=0; /* 1 AppName 2 KeyName */
  53. if((fp=fopen( profile, "r"))==NULL){
  54. printf("openfile [%s] error [%s]\n", profile, strerror(errno));
  55. return(-1);
  56. }
  57. fseek(fp, 0, SEEK_SET );
  58. memset(appname, 0, sizeof(appname) );
  59. sprintf(appname, "[%s]", AppName );
  60. while(! feof(fp) && fgets( buf_i, KEYVALLEN, fp )!=NULL){
  61. l_trim(buf_o, buf_i);
  62. if( strlen(buf_o) <= 0 )
  63. continue ;
  64. buf = NULL;
  65. buf = buf_o;
  66. if(found == 0){
  67. if( buf[0] != '[' ) {
  68. continue ;
  69. } else if (strncmp(buf,appname, strlen(appname))==0){
  70. found = 1;
  71. continue;
  72. }
  73. } else if( found == 1 ) {
  74. if (buf[0] == '#') {
  75. continue ;
  76. } else if ( buf[0] == '[' ) {
  77. break;
  78. } else {
  79. if( (c = (char *) strchr(buf, '=')) == NULL )
  80. continue ;
  81. memset( keyname, 0, sizeof(keyname) );
  82. sscanf(buf, "%[^=|^ |^\t]", keyname);
  83. if(strcmp(keyname, KeyName) == 0 ) {
  84. sscanf( ++c, "%[^\n]", KeyVal);
  85. char *KeyVal_o = (char *) malloc(strlen (KeyVal) + 1);
  86. if(KeyVal_o != NULL) {
  87. memset(KeyVal_o, 0, sizeof(KeyVal_o));
  88. a_trim(KeyVal_o, KeyVal);
  89. if(KeyVal_o && strlen(KeyVal_o) > 0)
  90. strcpy(KeyVal, KeyVal_o);
  91. free(KeyVal_o);
  92. KeyVal_o = NULL;
  93. }
  94. found = 2;
  95. break;
  96. } else {
  97. continue ;
  98. }
  99. }
  100. }
  101. }
  102. fclose (fp);
  103. if (found == 2 )
  104. return(0);
  105. else
  106. return(-1);
  107. }
  108. void main()
  109. {
  110. char ip[16];
  111. char dev[10];
  112. GetProfileString("./bb.txt", "cls_server", "ip", ip);
  113. GetProfileString("./bb.txt", "device", "dev", dev);
  114. printf("%s\n", ip);
  115. printf("%s\n", dev);
  116. }
  1. #cat bb.txt
  2. [cls_server]
  3. #配置文件等号左右可以有空格也可以没有
  4. ip=192.16.31.2
  5. [device]
  6. dev=sda

C解析config的更多相关文章

  1. 解析config文件 练手代码

    解析一个如下的CONFIG文件 #config.txt #SHTTPD Web 服务器配置文件示例 #侦听端口 ListenPort = 80 #最大并发访问客户端数目 MaxClient = 8 # ...

  2. Mybatis学习笔记2 - 解析config

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...

  3. TypeSafe Config使用

    ================typesafeconfig的使用==================== #1.加入依赖包 config-1.2.1.jar #2.加载配置 ConfigFactor ...

  4. Git原理入门解析

    前言: 之前听过公司大佬分享过 Git 原理之后就想来自己总结一下,最近一忙起来就拖得久了,本来想塞更多的干货,但是不喜欢拖太久,所以先出一版足够入门的: 一.Git 简介 Git 是当前流行的分布式 ...

  5. 深入Mybatis源码——配置解析

    @ 目录 前言 正文 配置解析 1. cacheRefElement/cacheElement 2. resultMapElements 3. sqlElement 4. buildStatement ...

  6. 探讨webapp的SEO难题(上)

    前言 网络蜘蛛无法解析javascript,至少百度是不能的,神马搜索差的更远,而我们的webapp的渲染展示完全由javascript驱动 所以蜘蛛访问webapp页面会得到一个白页面,比如,我们期 ...

  7. Selenium自动化测试框架介绍

    Selenium自动化测试框架介绍 1.测试架构作用 a.可维护性 b.提高编写脚本效率 c.提高脚本的可读性 2.框架的几大要素: Driver管理,脚本,数据,元素对象,LOG,报告,运行机制,失 ...

  8. Linux内核配置机制(make menuconfig 、Kconfig、Makefile)讲解【转】

    本文转载自:http://www.codexiu.cn/linux/blog/34801/ 前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式—— ...

  9. [Python][flask][flask-wtf]关于flask-wtf中API使用实例教程

    简介:简单的集成flask,WTForms,包括跨站请求伪造(CSRF),文件上传和验证码. 一.安装(Install) 此文仍然是Windows操作系统下的教程,但是和linux操作系统下的运行环境 ...

随机推荐

  1. Date.parse函数的兼容问题

    由于要用Date.parse函数解析一个日期时间的字符串.在谷歌浏览器中解析成功,但是IE.火狐中却不行. 不知何故.firefox对于类似"2010-12-20 15:55:00" ...

  2. jsp,velocity,freemark页面引擎的比較

    在java领域.表现层技术主要有三种:jsp.freemarker.velocity. jsp是大家最熟悉的技术 长处: 1.功能强大,能够写java代码 2.支持jsp标签(jsp tag) 3.支 ...

  3. Codeforces 196 D. The Next Good String

    D. The Next Good String time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  4. android中ping命令的实现

    /** * 推断Ping 网址是否返回成功 *  * @param netAddress * @return */ public static String isPingSuccess(int pin ...

  5. wordpress 配置(ubuntu)---修改 linux hostname

    使用阿里云服务器的 ubuntu 系统时的 hostname 太扭曲,而且有些命令会受 hostname 的影响不能正常使用,所以,一定要改掉它! 永久修改 hostname: 使用 nano 命令: ...

  6. 深入理解7816(1)---- 关于F/D和etu【转】

    本文转载自:http://blog.sina.com.cn/s/blog_4df8400a0101gkss.html 深入理解7816(1)---- 关于F/D和etu 对于刚接触智能卡的工程师来说, ...

  7. Poj2054 color a tree && [HNOI/AHOI2018]排列

    https://zybuluo.com/ysner/note/1120723 题面 原题 某省选强化题 大致意思是给你一颗树,选父亲后才能选儿子. 每个点对答案的贡献为你在第几次选这个点 × 该点权值 ...

  8. Rabbit-service Message queue MQ 验证 校验

    事务概要================================================================================================ ...

  9. 在网页上打印,js window.print

    window.print默认会打印出当前页在屏幕中显示的部分,可以实现在线打印

  10. ubuntu16.04更改源

    最近用apt-get安装软件总是提示列表无法全部更新,导致一些软件安装不上,下面我们通过讲/etc/apt/sources.list里为阿里源,实现访问. 第一步: 备份/etc/apt/source ...