基于C语言的配置文件管理
来源:互联网 发布:日本直播软件排名 编辑:程序博客网 时间:2024/04/30 19:18
软件设计中,经常会遇到一些参数文件的保存和读取,如果不考虑支持在程序外手动修改配置文件的话,就可以设计为以二进制方式来读写文件,这样会非常方便,不用考虑格式,整个结构体对象可以直接写入文件,并且整体读出。但是,如果希望能够在程序外手动修改配置文件,就需要以一种比较直观的方式来组织配置文件了,比如比较常用的有:xml文件,ini文件等等。这些都是一些“重量级”的配置文件管理方法,最近在嵌入式平台上开发软件程序,写了个简单的配置文件管理程序,整理了一下,发在这里供大家参考吧。
附件工程文件下载
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /2012年资料/1月/11日/基于C语言的配置文件管理/
读写的文件格式与ini文件格式很相似,但是功能远远没有ini那样强大,格式如下图:
代码发布如下,附件中有整个工程文件。
1. 配置文件管理API代码
- //////////////////////////////////////////////////////////////////////////
- // COPYRIGHT NOTICE
- // Copyright (c) 2011, 华中科技大学 卢俊(版权声明)
- // All rights reserved.
- //
- /// @file ConfigMgr.h
- /// @brief 配置文件管理API声明文件
- ///
- /// 提供配置文件管理的相关函数宏定义
- ///
- /// @version 1.0
- /// @author lujun
- /// @e-mail lujun.hust@gmail.com
- /// @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 lujun.hust@gmail.com
- /// @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 lujun.hust@gmail.com
- /// @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. 运行显示效果
- 基于C语言的配置文件管理
- 基于C语言的学生管理系统
- 基于c语言的租金管理系统
- 基于C语言的基础图书管理系统
- 基于C语言的食堂菜谱管理系统
- 内存的管理艺术(基于C语言)1
- 内存的管理艺术(基于C语言)2
- 基于文件管理的学生信息管理系统(C语言/C++)
- 基于C语言的万年历
- 基于C语言的通讯管理系统的设计与实现
- 网上找的c语言读取配置文件
- C语言读取配置文件的另类写法
- c语言实现配置文件的读写
- C# 配置文件管理
- C语言的内存管理
- C语言的内存管理
- C语言的内存管理
- C语言的内存管理
- 修改Win7菜单栏无法隐藏
- 读《企业应用架构模式》8 在一起
- 母函数题目小结
- 基础知识整理
- AC自动机——Aho-Corasick Automaton
- 基于C语言的配置文件管理
- PE文件格式详解(下)
- 【java】java学习(二)
- 《那些年啊,那些事——一个程序员的奋斗史》——119
- 链表的创建,打印,测长,删除,排序
- 以前项目中js写法3
- 开始整理我的知识
- Virtualbox虚拟Ubuntu共享文件夹设置
- 邮件系统选用语言的重要性【转】