歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 基於C語言的配置文件管理

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

日期:2017/3/1 10:40:15   编辑:Linux編程

軟件設計中,經常會遇到一些參數文件的保存和讀取,如果不考慮支持在程序外手動修改配置文件的話,就可以設計為以二進制方式來讀寫文件,這樣會非常方便,不用考慮格式,整個結構體對象可以直接寫入文件,並且整體讀出。但是,如果希望能夠在程序外手動修改配置文件,就需要以一種比較直觀的方式來組織配置文件了,比如比較常用的有: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. #ifndef CONFIGMGR_H_
  20. #define CONFIGMGR_H_
  21. #include <stdio.h>
  22. /** 尋找參數標識頭
  23. *
  24. * 在文件中定位到參數的標識
  25. * @param: char * header 參數標識字符串
  26. * @return: [int] 是否成功
  27. * @note:
  28. * @see:
  29. */
  30. int find_header( FILE *fp,char * header);
  31. // 把變量名轉換為字符串輸出
  32. #define TOSTRING(name) #name
  33. // 寫入參數標識頭
  34. #define WRITE_PARAM_HEADER(fp,Header) \
  35. fprintf(fp,"%s\n",Header)
  36. // 查找參數標識頭
  37. #define FIND_PARAM_HEADER(fp,Header) \
  38. find_header(fp,Header)
  39. // 保存參數宏,int參數
  40. #define SAVE_PARAM_INT(fp,Key,Value) \
  41. fprintf(fp,"%s= %d\n",#Key,Value)
  42. // 保存參數宏,字符串參數
  43. #define SAVE_PARAM_STR(fp,Key,Value) \
  44. fprintf(fp,"%s= %s\n",#Key,Value)
  45. // 讀取參數宏,int參數
  46. #define LOAD_PARAM_INT(fp,KeyAddr,ValueAddr) \
  47. fscanf(fp,"%s %d",KeyAddr,ValueAddr)
  48. // 讀取參數宏,字符串參數
  49. #define LOAD_PARAM_STR(fp,KeyAddr,ValueAddr) \
  50. fscanf(fp,"%s %s",KeyAddr,ValueAddr)
  51. #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. #include "ConfigMgr.h"
  20. #include <string.h>
  21. int find_header( FILE *fp,char * header)
  22. {
  23. char keyName[100];
  24. if( fp == NULL )
  25. {
  26. return -1;
  27. }
  28. while( !feof(fp) )
  29. {
  30. fscanf(fp,"%s",keyName);
  31. if( strcmp(keyName,header) == 0 )
  32. {
  33. return 0;
  34. }
  35. }
  36. printf("cannot find %s in file \n",header);
  37. return -1;
  38. }

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. #include "ConfigMgr.h"
  20. #define USER_CFG_FILE "user.cfg"
  21. #define USERINFO_HEADER "[UserInfo]"
  22. typedef struct _userInfo
  23. {
  24. char name[20];
  25. int ssno;
  26. char sex[4];
  27. }UserInfo;
  28. int save_cfg( char *filename,UserInfo *pInfo)
  29. {
  30. FILE *fp = NULL;
  31. if( ( fp = fopen(filename,"wt") ) == NULL )
  32. {
  33. printf("cannot open file %s\n",filename);
  34. return -1;
  35. }
  36. WRITE_PARAM_HEADER(fp,USERINFO_HEADER);
  37. SAVE_PARAM_STR(fp,name,pInfo->name);
  38. SAVE_PARAM_INT(fp,ssno,pInfo->ssno);
  39. SAVE_PARAM_STR(fp,sex,pInfo->sex);
  40. if (fp)
  41. {
  42. fclose(fp);
  43. }
  44. return 0;
  45. }
  46. int read_cfg( char *filename,UserInfo * pInfo )
  47. {
  48. FILE *fp = NULL;
  49. char keyName[100];
  50. if( ( fp = fopen(filename,"rt") ) == NULL )
  51. {
  52. printf("cannot open file %s\n",filename);
  53. return -1;
  54. }
  55. if( FIND_PARAM_HEADER(fp,USERINFO_HEADER) != 0)
  56. {
  57. return -1;
  58. }
  59. LOAD_PARAM_STR(fp,keyName,pInfo->name);
  60. LOAD_PARAM_INT(fp,keyName,&pInfo->ssno);
  61. LOAD_PARAM_STR(fp,keyName,pInfo->sex);
  62. if (fp)
  63. {
  64. fclose(fp);
  65. }
  66. return 0;
  67. }
  68. void main()
  69. {
  70. UserInfo user = { "lujun",110,"boy"};
  71. UserInfo userRead;
  72. save_cfg(USER_CFG_FILE,&user);
  73. printf("enter any key to show user.cfg\n");
  74. getchar();
  75. read_cfg(USER_CFG_FILE,&userRead);
  76. printf("userInfo:\nname:%s\nssno:%d\nsex:%s\n",userRead.name,userRead.ssno,userRead.sex);
  77. getchar();
  78. getchar();
  79. }

3. 運行顯示效果

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

Copyright © Linux教程網 All Rights Reserved