歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

基於C語言的配置文件管理

軟件設計中,經常會遇到一些參數文件的保存和讀取,如果不考慮支持在程序外手動修改配置文件的話,就可以設計為以二進制方式來讀寫文件,這樣會非常方便,不用考慮格式,整個結構體對象可以直接寫入文件,並且整體讀出。但是,如果希望能夠在程序外手動修改配置文件,就需要以一種比較直觀的方式來組織配置文件了,比如比較常用的有:xml文件,ini文件等等。這些都是一些“重量級”的配置文件管理方法,最近在嵌入式平台上開發軟件程序,寫了個簡單的配置文件管理程序,整理了一下,發在這裡供大家參考吧。

附件工程文件下載

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2012年資料/1月/11日/基於C語言的配置文件管理/

      讀寫的文件格式與ini文件格式很相似,但是功能遠遠沒有ini那樣強大,格式如下圖:

      650) this.width=650;" border=0>

      代碼發布如下,附件中有整個工程文件

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  [email protected]  
  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  [email protected]  
  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  [email protected]  
  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.  運行顯示效果

650) this.width=650;" border=0>

Copyright © Linux教程網 All Rights Reserved