基于C语言的配置文件管理

来源:互联网 发布:日本直播软件排名 编辑:程序博客网 时间:2024/04/30 19:18

软件设计中,经常会遇到一些参数文件的保存和读取,如果不考虑支持在程序外手动修改配置文件的话,就可以设计为以二进制方式来读写文件,这样会非常方便,不用考虑格式,整个结构体对象可以直接写入文件,并且整体读出。但是,如果希望能够在程序外手动修改配置文件,就需要以一种比较直观的方式来组织配置文件了,比如比较常用的有:xml文件,ini文件等等。这些都是一些“重量级”的配置文件管理方法,最近在嵌入式平台上开发软件程序,写了个简单的配置文件管理程序,整理了一下,发在这里供大家参考吧。

附件工程文件下载

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是www.linuxidc.com

具体下载目录在 /2012年资料/1月/11日/基于C语言的配置文件管理/

      读写的文件格式与ini文件格式很相似,但是功能远远没有ini那样强大,格式如下图:

      

      代码发布如下,附件中有整个工程文件

1.  配置文件管理API代码

  1. //////////////////////////////////////////////////////////////////////////  
  2. //  COPYRIGHT NOTICE  
  3. //  Copyright (c) 2011, 华中科技大学 卢俊(版权声明)  
  4. //  All rights reserved.  
  5. //  
  6. /// @file    ConfigMgr.h   
  7. /// @brief   配置文件管理API声明文件  
  8. ///  
  9. /// 提供配置文件管理的相关函数宏定义  
  10. ///  
  11. /// @version 1.0    
  12. /// @author  lujun  
  13. /// @e-mail  lujun.hust@gmail.com  
  14. /// @date    2011/11/24  
  15. //  
  16. //  
  17. //  修订说明:  
  18. //////////////////////////////////////////////////////////////////////////  
  19.  
  20. #ifndef CONFIGMGR_H_  
  21. #define CONFIGMGR_H_  
  22.  
  23. #include <stdio.h>  
  24.  
  25. /** 寻找参数标识头  
  26.  *  
  27.  *  在文件中定位到参数的标识  
  28.  *  @param:  char * header 参数标识字符串  
  29.  *  @return: [int]  是否成功  
  30.  *  @note:     
  31.  *  @see:      
  32.  */   
  33. int find_header( FILE *fp,char * header);  
  34.  
  35. // 把变量名转换为字符串输出  
  36. #define TOSTRING(name) #name   
  37.  
  38. // 写入参数标识头  
  39. #define WRITE_PARAM_HEADER(fp,Header) \  
  40.     fprintf(fp,"%s\n",Header)  
  41.  
  42. // 查找参数标识头 
  43. #define FIND_PARAM_HEADER(fp,Header) \  
  44.     find_header(fp,Header)  
  45.  
  46. // 保存参数宏,int参数  
  47. #define SAVE_PARAM_INT(fp,Key,Value) \  
  48.     fprintf(fp,"%s= %d\n",#Key,Value)  
  49.  
  50. // 保存参数宏,字符串参数  
  51. #define SAVE_PARAM_STR(fp,Key,Value) \  
  52.     fprintf(fp,"%s= %s\n",#Key,Value)  
  53.  
  54. // 读取参数宏,int参数  
  55. #define LOAD_PARAM_INT(fp,KeyAddr,ValueAddr) \  
  56.     fscanf(fp,"%s %d",KeyAddr,ValueAddr)  
  57.  
  58. // 读取参数宏,字符串参数  
  59. #define LOAD_PARAM_STR(fp,KeyAddr,ValueAddr) \  
  60.     fscanf(fp,"%s %s",KeyAddr,ValueAddr)  
  61.  
  62. #endif  // CONFIGMGR_H_ 
  1. //////////////////////////////////////////////////////////////////////////  
  2. //  COPYRIGHT NOTICE  
  3. //  Copyright (c) 2011, 华中科技大学 卢俊(版权声明)  
  4. //  All rights reserved.  
  5. //  
  6. /// @file    ConfigMgr.c   
  7. /// @brief   配置文件管理  
  8. ///  
  9. /// 提供配置文件管理的相关函数实现  
  10. ///  
  11. /// @version 1.0    
  12. /// @author  lujun  
  13. /// @e-mail  lujun.hust@gmail.com  
  14. /// @date    2011/11/24  
  15. //  
  16. //  
  17. //  修订说明:  
  18. //////////////////////////////////////////////////////////////////////////  
  19.  
  20. #include "ConfigMgr.h"  
  21. #include <string.h>  
  22.  
  23. int find_header( FILE *fp,char * header)  
  24. {  
  25.     char keyName[100];  
  26.  
  27.     if( fp == NULL )  
  28.     {  
  29.         return -1;  
  30.     }  
  31.  
  32.     while( !feof(fp) )  
  33.     {  
  34.         fscanf(fp,"%s",keyName);  
  35.         if( strcmp(keyName,header) == 0 )  
  36.         {  
  37.             return 0;  
  38.         }  
  39.     }   
  40.  
  41.     printf("cannot find %s in file \n",header);  
  42.  
  43.     return -1;  

2.  测试代码

  1. //////////////////////////////////////////////////////////////////////////  
  2. //  COPYRIGHT NOTICE  
  3. //  Copyright (c) 2011, 华中科技大学 卢俊(版权声明)  
  4. //  All rights reserved.  
  5. //  
  6. /// @file    test.c   
  7. /// @brief   配置文件管理测试代码  
  8. ///  
  9. /// 测试配置文件管理相关函数  
  10. ///  
  11. /// @version 1.0    
  12. /// @author  lujun  
  13. /// @e-mail  lujun.hust@gmail.com  
  14. /// @date    2011/11/24  
  15. //  
  16. //  
  17. //  修订说明:  
  18. //////////////////////////////////////////////////////////////////////////  
  19.  
  20. #include "ConfigMgr.h"  
  21.  
  22. #define USER_CFG_FILE   "user.cfg"  
  23. #define USERINFO_HEADER "[UserInfo]"  
  24.  
  25. typedef struct _userInfo  
  26. {  
  27.     char name[20];  
  28.     int  ssno;  
  29.     char sex[4];  
  30.  
  31. }UserInfo;  
  32.  
  33. int save_cfg( char *filename,UserInfo *pInfo)  
  34. {  
  35.     FILE *fp = NULL;  
  36.  
  37.     if( ( fp = fopen(filename,"wt") ) == NULL )  
  38.     {  
  39.         printf("cannot open file %s\n",filename);  
  40.         return -1;  
  41.     }  
  42.  
  43.     WRITE_PARAM_HEADER(fp,USERINFO_HEADER);  
  44.  
  45.     SAVE_PARAM_STR(fp,name,pInfo->name);  
  46.     SAVE_PARAM_INT(fp,ssno,pInfo->ssno);  
  47.     SAVE_PARAM_STR(fp,sex,pInfo->sex);  
  48.  
  49.     if (fp)  
  50.     {  
  51.         fclose(fp);  
  52.     }  
  53.  
  54.     return 0;  
  55. }  
  56.  
  57. int read_cfg( char *filename,UserInfo * pInfo )  
  58. {  
  59.     FILE *fp = NULL;  
  60.     char keyName[100];  
  61.  
  62.     if( ( fp = fopen(filename,"rt") ) == NULL )  
  63.     {  
  64.         printf("cannot open file %s\n",filename);  
  65.         return -1;  
  66.     }  
  67.  
  68.     if( FIND_PARAM_HEADER(fp,USERINFO_HEADER) != 0)  
  69.     {  
  70.         return -1;  
  71.     }  
  72.  
  73.     LOAD_PARAM_STR(fp,keyName,pInfo->name);  
  74.     LOAD_PARAM_INT(fp,keyName,&pInfo->ssno);  
  75.     LOAD_PARAM_STR(fp,keyName,pInfo->sex);  
  76.  
  77.     if (fp)  
  78.     {  
  79.         fclose(fp);  
  80.     }  
  81.  
  82.     return 0;  
  83. }  
  84.  
  85. void main()  
  86. {  
  87.     UserInfo user = { "lujun",110,"boy"};  
  88.     UserInfo userRead;  
  89.  
  90.     save_cfg(USER_CFG_FILE,&user);  
  91.  
  92.     printf("enter any key to show user.cfg\n");  
  93.  
  94.     getchar();  
  95.  
  96.     read_cfg(USER_CFG_FILE,&userRead);  
  97.  
  98.     printf("userInfo:\nname:%s\nssno:%d\nsex:%s\n",userRead.name,userRead.ssno,userRead.sex);  
  99.  
  100.     getchar();  
  101.     getchar();  

3.  运行显示效果


原创粉丝点击