一. 配置文件读写案例实现分析
1、 功能划分
a) 界面测试(功能集成)
自己动手规划接口模型。
b) 配置文件读写
1)配置文件读(根据key,读取valude)
2)配置文件写(输入key、valude)
3)配置文件修改(输入key、valude)
4)优化 ===》接口要求紧 模块要求松
二.代码实现
cfg_op.h
#ifndef __CFG_OP_H
#define __CFG_OP_H
#ifdef __cplusplus
extern "C" {
#endif
//写配置项
int writeCfg(const char *filename,const char*key,const char*value);
//读配置项
int readCfg(const char *filename,const char*key, char*value);
//去除字符串中前后的空格
int trimSpace(char*inStr,char*out);
#ifdef __cplusplus
}
#endif
#endif
cfg_op.c
#include
#include
#include
#define MaxLine 2048
//读配置项
int readCfg(const char *filename,const char*key, char*valuebuf)
{
int ret = 0;
FILE *fp = NULL;
char buf[MaxLine];
char* tmp =NULL;
fp = fopen(filename,"r");
if (fp == NULL)
{
ret = -1;
return ret;
}
//key1 = abcdefg
while (!feof(fp))
{
memset(buf,0,sizeof(buf));
fgets(buf,MaxLine,fp);
// printf("buf:%s",buf);
tmp = strchr(buf,'=');
if (tmp==NULL)//没有等号
{
continue;
}
tmp = strstr(buf,key);//判断所在行是否有key
if (tmp == NULL)
{
continue;
}
tmp = tmp + strlen(key);
tmp = strchr(tmp,'=');
if (tmp == NULL)
{
continue;
}
tmp = tmp+1;
//去除tmp前后空格
ret = trimSpace(tmp,valuebuf);
if (ret!=0)
{
printf("func trimSpace() err :%d\n",ret);
return ret ;
}
}
return ret;
}
//写配置项
//实现流程
//循环读取每一行,检查key配置项是否存在,若存在则修改对应的value
//若不存在,在文件末尾添加 key=value
int writeCfg(const char *filename,const char*key,const char*valuebuf)
{
int ret = 0,iTag = 0,length=0;
FILE *fp = NULL;
char linebuf[MaxLine];
char* tmp =NULL;
char filebuf[1024*8]={0};
if (filename==NULL||key==NULL||valuebuf==NULL)
{
printf("func writeCfg() param err\n");
ret = -1;
return ret;
}
fp = fopen(filename,"a+");//读写的方式打开文件
if (fp == NULL)
{
ret = -1;
printf("func fopen err:%d\n",ret);
return ret;
}
fseek(fp,0L,SEEK_END);//文件指针定位到文件末尾
length = ftell(fp);
fseek(fp,0L,SEEK_SET);//文件指针定位到文件开头
if (length > 1024*8)
{
ret = -1;
printf("file > 8K not support\n");
return ret;
}
while (!feof(fp))
{
//循环读取一行
memset(linebuf,0,sizeof(linebuf));
tmp = fgets(linebuf,MaxLine,fp);
if (tmp ==NULL)
{
break;
}
//key关键字是否在本行
tmp = strstr(linebuf,key);
if (tmp == NULL)//不在本行
{
strcat(filebuf,linebuf);//追加本行到filebuf中
continue;//继续下轮循环
}
else//在本行 将新的key = value copy到filebuf中
{
sprintf(linebuf,"%s = %s\n",key,valuebuf);//将新的key = value 覆盖掉旧的
strcat(filebuf,linebuf);
iTag = 1;//标志位 key在本行
}
}
//key不在文件中,在文件末尾追加
if (iTag == 0)
{
ret = fprintf(fp,"%s = %s\n",key,valuebuf);
if (ret == -1)
{
printf("func sprintf() error\n");
return ret;
}
if (fp != NULL)
{
fclose(fp);
}
}
else//key存在文件中 创建新文件覆盖旧文件
{
if (fp!=NULL)
{
//关闭原来的文件
fclose(fp);
}
fp = fopen(filename,"w+t");
if (fp == NULL)
{
ret = -1;
printf("func fopen() err \n");
return ret;
}
ret = fputs(filebuf,fp);
if ( ret < 0 )
{
printf("func fputs err \n");
return ret;
}
if (fp!=NULL)
{
fclose(fp);
}
}
return 0;
}
//去除字符串前后的空格
int trimSpace(char*inStr,char*out)
{
char *p = inStr;
int ret = 0;
int i;
if (p==NULL)
{
ret = -1;
return;
}
for (i=0;p[i]!='\0';i++)
{
if (p[i]!=' ')
{
*out++ = p[i];
}
}
*out='\0';
return ret;
}
test.c
#include
#include
#include
#include "cfg_op.h"
#define CFGNAME "e:/mycfg.ini"
void memu()
{
printf("======================\n");
printf("1.测试写配置文件\n");
printf("2.测试读配置文件\n");
printf("0.退出配置文件\n");
printf("======================\n");
}
int TwriteCfg()
{
char key[1024] = {0};
char valuebuf[1024] = {0};
int ret = 0;
//从键盘获取输入
printf("\n请键入key:");
scanf("%s",key);
printf("\n请键入value:");
scanf("%s",valuebuf);
printf("您的输入是:%s = %s\n",key,valuebuf);
ret = writeCfg(CFGNAME,key,valuebuf);
if (ret!=0)
{
printf("func writeCfg err:%d\n",ret);
return ret;
}
return ret;
}
int TreadCfg()
{
char key[1024] = {0};
char valuebuf[1024] = {0};
int ret = 0;
//从键盘获取输入
printf("\n请键入key:");
scanf("%s",key);
ret = readCfg(CFGNAME,key,valuebuf);
if (ret!=0)
{
printf("func readCfg err:%d\n",ret);
return ret;
}
printf("value:%s\n",valuebuf);
return ret;
}
int main()
{
int choice;
for (;;)
{
memu();
scanf("%d",&choice);
switch(choice)
{
case 1://写配置项
TwriteCfg();
break;
case 2://读配置项
TreadCfg();
break;
case 0:
exit(0);
break;
default:
exit(0);
}
}
system("pause");
return 0;
}
图形界面