軟件設計中,經常會遇到一些參數文件的保存和讀取,如果不考慮支持在程序外手動修改配置文件的話,就可以設計為以二進制方式來讀寫文件,這樣會非常方便,不用考慮格式,整個結構體對象可以直接寫入文件,並且整體讀出。但是,如果希望能夠在程序外手動修改配置文件,就需要以一種比較直觀的方式來組織配置文件了,比如比較常用的有:xml文件,ini文件等等。這些都是一些“重量級”的配置文件管理方法,最近在嵌入式平台上開發軟件程序,寫了個簡單的配置文件管理程序,整理了一下,發在這裡供大家參考吧。
附件工程文件下載
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2012年資料/1月/11日/基於C語言的配置文件管理/
讀寫的文件格式與ini文件格式很相似,但是功能遠遠沒有ini那樣強大,格式如下圖:
650) this.width=650;" border=0>
代碼發布如下,附件中有整個工程文件。
1. 配置文件管理API代碼
- //////////////////////////////////////////////////////////////////////////
- // COPYRIGHT NOTICE
- // Copyright (c) 2011, 華中科技大學 盧俊(版權聲明)
- // All rights reserved.
- //
- /// @file ConfigMgr.h
- /// @brief 配置文件管理API聲明文件
- ///
- /// 提供配置文件管理的相關函數宏定義
- ///
- /// @version 1.0
- /// @author lujun
- /// @e-mail [email protected]
- /// @date 2011/11/24
- //
- //
- // 修訂說明:
- //////////////////////////////////////////////////////////////////////////
- #ifndef CONFIGMGR_H_
- #define CONFIGMGR_H_
- #include <stdio.h>
- /** 尋找參數標識頭
- *
- * 在文件中定位到參數的標識
- * @param: char * header 參數標識字符串
- * @return: [int] 是否成功
- * @note:
- * @see:
- */
- int find_header( FILE *fp,char * header);
- // 把變量名轉換為字符串輸出
- #define TOSTRING(name) #name
- // 寫入參數標識頭
- #define WRITE_PARAM_HEADER(fp,Header) \
- fprintf(fp,"%s\n",Header)
- // 查找參數標識頭
- #define FIND_PARAM_HEADER(fp,Header) \
- find_header(fp,Header)
- // 保存參數宏,int參數
- #define SAVE_PARAM_INT(fp,Key,Value) \
- fprintf(fp,"%s= %d\n",#Key,Value)
- // 保存參數宏,字符串參數
- #define SAVE_PARAM_STR(fp,Key,Value) \
- fprintf(fp,"%s= %s\n",#Key,Value)
- // 讀取參數宏,int參數
- #define LOAD_PARAM_INT(fp,KeyAddr,ValueAddr) \
- fscanf(fp,"%s %d",KeyAddr,ValueAddr)
- // 讀取參數宏,字符串參數
- #define LOAD_PARAM_STR(fp,KeyAddr,ValueAddr) \
- fscanf(fp,"%s %s",KeyAddr,ValueAddr)
- #endif // CONFIGMGR_H_
- //////////////////////////////////////////////////////////////////////////
- // COPYRIGHT NOTICE
- // Copyright (c) 2011, 華中科技大學 盧俊(版權聲明)
- // All rights reserved.
- //
- /// @file ConfigMgr.c
- /// @brief 配置文件管理
- ///
- /// 提供配置文件管理的相關函數實現
- ///
- /// @version 1.0
- /// @author lujun
- /// @e-mail [email protected]
- /// @date 2011/11/24
- //
- //
- // 修訂說明:
- //////////////////////////////////////////////////////////////////////////
- #include "ConfigMgr.h"
- #include <string.h>
- int find_header( FILE *fp,char * header)
- {
- char keyName[100];
- if( fp == NULL )
- {
- return -1;
- }
- while( !feof(fp) )
- {
- fscanf(fp,"%s",keyName);
- if( strcmp(keyName,header) == 0 )
- {
- return 0;
- }
- }
- printf("cannot find %s in file \n",header);
- return -1;
- }
2. 測試代碼
- //////////////////////////////////////////////////////////////////////////
- // COPYRIGHT NOTICE
- // Copyright (c) 2011, 華中科技大學 盧俊(版權聲明)
- // All rights reserved.
- //
- /// @file test.c
- /// @brief 配置文件管理測試代碼
- ///
- /// 測試配置文件管理相關函數
- ///
- /// @version 1.0
- /// @author lujun
- /// @e-mail [email protected]
- /// @date 2011/11/24
- //
- //
- // 修訂說明:
- //////////////////////////////////////////////////////////////////////////
- #include "ConfigMgr.h"
- #define USER_CFG_FILE "user.cfg"
- #define USERINFO_HEADER "[UserInfo]"
- typedef struct _userInfo
- {
- char name[20];
- int ssno;
- char sex[4];
- }UserInfo;
- int save_cfg( char *filename,UserInfo *pInfo)
- {
- FILE *fp = NULL;
- if( ( fp = fopen(filename,"wt") ) == NULL )
- {
- printf("cannot open file %s\n",filename);
- return -1;
- }
- WRITE_PARAM_HEADER(fp,USERINFO_HEADER);
- SAVE_PARAM_STR(fp,name,pInfo->name);
- SAVE_PARAM_INT(fp,ssno,pInfo->ssno);
- SAVE_PARAM_STR(fp,sex,pInfo->sex);
- if (fp)
- {
- fclose(fp);
- }
- return 0;
- }
- int read_cfg( char *filename,UserInfo * pInfo )
- {
- FILE *fp = NULL;
- char keyName[100];
- if( ( fp = fopen(filename,"rt") ) == NULL )
- {
- printf("cannot open file %s\n",filename);
- return -1;
- }
- if( FIND_PARAM_HEADER(fp,USERINFO_HEADER) != 0)
- {
- return -1;
- }
- LOAD_PARAM_STR(fp,keyName,pInfo->name);
- LOAD_PARAM_INT(fp,keyName,&pInfo->ssno);
- LOAD_PARAM_STR(fp,keyName,pInfo->sex);
- if (fp)
- {
- fclose(fp);
- }
- return 0;
- }
- void main()
- {
- UserInfo user = { "lujun",110,"boy"};
- UserInfo userRead;
- save_cfg(USER_CFG_FILE,&user);
- printf("enter any key to show user.cfg\n");
- getchar();
- read_cfg(USER_CFG_FILE,&userRead);
- printf("userInfo:\nname:%s\nssno:%d\nsex:%s\n",userRead.name,userRead.ssno,userRead.sex);
- getchar();
- getchar();
- }
3. 運行顯示效果
650) this.width=650;" border=0>