免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 54isno
打印 上一主题 下一主题

hi,问个C语言读取配置文件的问题 [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
11 [报告]
发表于 2010-03-11 11:50 |只看该作者
本帖最后由 yulihua49 于 2010-03-11 12:06 编辑
环境是linux
   请问有没有现成的类库可以读取conf的文件

   比如
   http.confC 可以读取port的值?
54isno 发表于 2010-03-10 22:09



在SDBC库里有一个envcfg函数,把你那语法配置到环境变量,使用者从环境变量取用即可,这样配置是比较自由的,应用程序可以自由定义配置项。而且配置项可以传送到子进程或从父进程继承。
源码如下:

  1. #include <strproc.h>
  2. #include <regex.h>

  3. #define REGNUM 3

  4. static char env_src[]="\\$[{(]{0,1}([A-Za-z_][0-9A-Za-z_]*)[})]{0,1}";
  5. static regex_t env_rp;
  6. static compflg=0;

  7. static void reg_free(void)
  8. {
  9.         if(compflg) {
  10.                 compflg=0;
  11.                 regfree(&env_rp);
  12.         }
  13. }

  14. int substitute_env(char *line)
  15. {
  16. char env[256];
  17. char *p=line,*envp,*getenv();
  18. regmatch_t pmatch[REGNUM];
  19. int i;
  20.         if(!line) return 0;
  21.         if(!compflg) {
  22.             i=regcomp(&env_rp,env_src,REG_EXTENDED);
  23.             if(i) {
  24.                 regerror(i,&env_rp,line,100);
  25.                 return -1;
  26.             }
  27.             compflg=1;
  28.         }
  29.         while(!(i=regexec(&env_rp,p,REGNUM,pmatch,0))) {
  30.                 for(envp=p+pmatch[1].rm_so;envp<p+pmatch[1].rm_eo;envp++) {
  31.                         env[i++]=*envp;
  32.                 }
  33.                 env[i]=0;
  34.                 envp=getenv(env);
  35.                 if(!envp) envp=".";
  36.                 p=strsubst(p+pmatch[0].rm_so,
  37.                         pmatch[0].rm_eo - pmatch[0].rm_so,envp);
  38.         }
  39.         return 0;
  40. }

  41. int envcfg(fname)
  42. char *fname;
  43. {
  44. FILE *fd;
  45. int i;
  46. char buffer[1024],*cp;
  47.         fd=fopen(fname,"r");
  48.         if(fd){
  49.                 while(!ferror(fd)){
  50.                         fgets(buffer,sizeof(buffer),fd);
  51.                         if(feof(fd)) break;
  52.                         TRIM(buffer);
  53.                         i=skipblk(buffer)-buffer;
  54.                         strsubst(buffer,i,(char *)0);
  55.                         if(!*buffer || *buffer=='#') continue;
  56.                         i=substitute_env(buffer);
  57.                         if(i) {
  58.                                 fprintf(stderr,"%s",buffer);
  59.                                 fclose(fd);
  60.                                 reg_free();
  61.                                 return i;
  62.                         }
  63. #ifdef WIN32
  64.                         putenv(buffer);
  65. #else
  66.                         cp=strdup(buffer);
  67.                         putenv(cp);
  68. #endif
  69.                 }
  70.                 reg_free();
  71.                 fclose(fd);
  72.         } else {
  73.                 return errno;
  74.         }
  75.         return 0;
  76. }
  77. int strcfg(char *buffer)
  78. {
  79. int i;
  80. char *cp;
  81.         i=skipblk(buffer)-buffer;
  82.         strsubst(buffer,i,(char *)0);
  83.         if(!*buffer || *buffer=='#') return 1;
  84.         i=substitute_env(buffer);
  85.         if(i) return i;
  86. #ifdef WIN32
  87.         putenv(buffer);
  88. #else
  89.         cp=strdup(buffer);
  90.         putenv(cp);
  91. #endif
  92.         reg_free();
  93.         return 0;
  94. }
复制代码
使用envcfg(filename)即可,支持$NAME的宏代换。
例子:
cat xcom.ini

  1. #xcom的配置文件
  2. #uasge:xcom xcom.ini [option]
  3. #如果没有option,xcom默认的动作是取文件到本地的$RECVDIR目录下
  4. #option: l 目录列表。@/ 服务器上$HOME目录,$/服务器上$SENDDIR目录.
  5. #        p 上传文件
  6. #        E 远程执行命令

  7. #HOST=192.168.0.105
  8. #SERVER=xcomd
  9. #通过转发器
  10. SERVER=mid
  11. HOST=192.168.38.195
  12. LOGFILE=$HOME/log/cli
  13. LOGLEVEL=5
  14. RECVDIR=$HOME/recv
  15. CADIR=$HOME/config/ca

  16. DEVID=YLHTEST

  17. #由服务器安排的你的工作目录
  18. LABEL=wL~Vs5mto87ztOL0rSuW
  19. #SENDSIZE=1500;
  20. # if MVFLG != 0 NZ_GetFile() 成功后,服务器侧将文件移走(到 $RECVTMP 目录下);
  21. MVFLG=0

  22. # mid to xcomd
  23. DNODE=1
复制代码
使用方法:

  1.         envcfg(argv[1]);
  2.    
  3.         cp=getenv("HOST");
  4.         if(!cp||!*cp) cp="localhost";
  5.         strcpy(conn.Host,cp);
  6.         cp=getenv("SERVER");
  7.         if(!cp||!*cp) cp="xcom";
  8.         strcpy(conn.Service,cp);
  9. //printf("host=%s,server=%s\n",conn.Host,conn.Service);
  10.         cc=Net_Connect(&conn,&clidata,0);
复制代码

论坛徽章:
0
12 [报告]
发表于 2010-03-11 12:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
13 [报告]
发表于 2010-03-11 14:06 |只看该作者
我觉得,,这个时代,,用xml来当配置文件比较好阿
iamybj 发表于 2010-03-11 12:12



    xml比较罗嗦,简单问题复杂化的样板。

论坛徽章:
0
14 [报告]
发表于 2010-03-11 20:33 |只看该作者
谢谢CU各位热心的网友

论坛徽章:
0
15 [报告]
发表于 2010-03-11 21:55 |只看该作者
如果在找一个简单的配置文件库, 可以试试这个: http://code.google.com/p/treeconf/downloads/list
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP