📄 configdeal.cpp
字号:
/*********************************************************************
* Copyright (c) 2001
* All rights reserved.
*
* 文件名称:configdeal.cpp
* 文件标识:ZJ-EC-SEPA-PROC-P016-0002
* 摘 要:定义Cconfigdeal类,提供配置表文件读、写、修改等功能
*
* 当前版本:2.0
* 作 者:曾新荣
* 完成日期:2001年12月20日
*
* 取代版本:1.0
* 原作者 :何爱民
* 完成日期:2001年11月15日
**********************************************************************/
#include "stdafx.h"
#include "configdeal.h"
Cconfigdeal::Cconfigdeal()
{
filename[0] = '\0';
}
Cconfigdeal::~Cconfigdeal()
{
}
/***********************************************************************
功 能:从配置表读指定节指定项的字符串型值,用buf带回
性 质:public
输入参数:section--指定的节;item--指定的数据键;buflen--缓存区buf的大小
输出参数:buf--带回字符串型值的缓存区
返回 值:0--成功;-1--失败
***********************************************************************/
int Cconfigdeal::readcfgdata(char *section, char *item, char *buf, int buflen)
{
int section_find_flag;
int item_find_flag;
int no_require_read_flag;
FILE *fp; //文件指针
char section_buf[201]; //缓存section
char getbuf[300]; //READ数据缓存区
char retbuf[300]; //找到数据键值缓存区
char *pstr;
pstr = NULL;
if ((fp = fopen(filename, "r")) == NULL)
{
//文件无法打开
return -1;
}
if((section == NULL) || (strlen(section) > (sizeof(section_buf) - 2)))
{
//section不合法
fclose(fp);
return -1;
}
sprintf(section_buf,"%c%s%c",LEFTSQUARE,section,RIGHTSQUARE);
if((item == NULL) || (strlen(item) > sizeof(getbuf)))
{
//item不合法
fclose(fp);
return -1;
}
//从文件中读数据
section_find_flag = -1;
item_find_flag = -1;
no_require_read_flag = -1;
while(fgets(getbuf, sizeof(getbuf), fp) != NULL)
{
//找[section]
if(section_find_flag == -1)
{
//找[section]
if((pstr = strstr(getbuf,section_buf)) != NULL)
{
section_find_flag = 0;
continue;
}
}
//找item
if(section_find_flag == 0)
{
//判断本行是否是section
if(checklinesection(getbuf) == 0)
{
//本section结束,找不到item
no_require_read_flag = 0;
break;
}
//找item
if((pstr = strstr(getbuf,item)) != NULL)
{
//去item和空格
pstr += strlen(item);
while(*pstr == BLANKCHARA)
{
pstr++;
}
//找到item
if (*pstr == EQUALCHARA)
{
item_find_flag = 0;
no_require_read_flag = 0;
pstr++;
strcpy(retbuf,pstr);
delitemtail(retbuf);
break;
}
}
}
//不需要读文件,退出文件
if(no_require_read_flag == 0)
{
break;
}
}
fclose(fp);
//没有找到
if(item_find_flag != 0)
{
return -1;
}
//返回缓冲区不够大
if(buflen < (int)strlen(retbuf))
{
return -1;
}
strcpy(buf,retbuf);
return 0;
}
/***********************************************************************
功 能:从配置表读指定节指定项的short型值,用buf带回
性 质:public
输入参数:section--指定的节;item--指定的数据键
输出参数:valuep--带回short型值的指针
返回 值:0--成功;-1--失败
***********************************************************************/
int Cconfigdeal::readcfgdata(char *section, char *item, short *valuep)
{
if(readcfgdata(section,item,buffer,sizeof(buffer)) != 0)
{
return -1;
}
*valuep = (short)atoi(buffer);
return 0;
}
/***********************************************************************
功 能:从配置表读指定节指定项的unsigned short型值,用buf带回
性 质:public
输入参数:section--指定的节;item--指定的数据键
输出参数:valuep--带回unsigned short型值的指针
返回 值:0--成功;-1--失败
***********************************************************************/
int Cconfigdeal::readcfgdata(char *section, char *item, unsigned short *valuep)
{
if(readcfgdata(section,item,buffer,sizeof(buffer)) != 0)
{
return -1;
}
*valuep = (unsigned short)atoi(buffer);
return 0;
}
/***********************************************************************
功 能:从配置表读指定节指定项的int型值,用buf带回
性 质:public
输入参数:section--指定的节;item--指定的数据键
输出参数:valuep--带回int型值的指针
返回 值:0--成功;-1--失败
***********************************************************************/
int Cconfigdeal::readcfgdata(char *section, char *item, int *valuep)
{
if(readcfgdata(section,item,buffer,sizeof(buffer)) != 0)
{
return -1;
}
*valuep = atoi(buffer);
return 0;
}
/***********************************************************************
功 能:从配置表读指定节指定项的unsigned int型值,用buf带回
性 质:public
输入参数:section--指定的节;item--指定的数据键
输出参数:valuep--带回unsigned int型值的指针
返回 值:0--成功;-1--失败
***********************************************************************/
int Cconfigdeal::readcfgdata(char *section, char *item, unsigned int *valuep)
{
if(readcfgdata(section,item,buffer,sizeof(buffer)) != 0)
{
return -1;
}
*valuep = (unsigned int)atoi(buffer);
return 0;
}
/***********************************************************************
功 能:添加字符串型数据键和数据键值
性 质:public
输入参数:section--指定的节;item--指定的数据键;buf--需要添加的数据键值
输出参数:无
返回 值:0--成功;-1--失败
***********************************************************************/
int Cconfigdeal::addcfgdata(char *section, char *item, char *buf)
{
int section_find_flag;
FILE *fp; //文件指针
FILE *fptmp; //文件指针
char section_buf[201]; //缓存section
char getbuf[300]; //READ数据缓存区
char retbuf[300]; //找到数据键值缓存区
char filetmp[120]; //临时文件名
char filebak[120]; //备份文件名
char *pstr;
if(readcfgdata(section,item,retbuf,sizeof(retbuf)) == 0)
{
//已经存在,出错
return -1;
}
pstr = NULL;
sprintf(filetmp,"%stmp",filename);
if ((fp = fopen(filename, "r")) == NULL)
{
//文件无法打开
return -1;
}
if ((fptmp = fopen(filetmp, "w")) == NULL)
{
//文件无法创建
fclose(fp);
return -1;
}
sprintf(section_buf,"%c%s%c",LEFTSQUARE,section,RIGHTSQUARE);
section_find_flag = -1;
while(fgets(getbuf, sizeof(getbuf), fp) != NULL)
{
//找[section]
if((pstr = strstr(getbuf,section_buf)) != NULL)
{
//写入[section]项
if(fprintf(fptmp,"%s",getbuf) < 0)
{
fclose(fp);
fclose(fptmp);
return -1;
}
section_find_flag = 0;
//写入item项
if(fprintf(fptmp,"%s=%s\n",item,buf) < 0)
{
fclose(fp);
fclose(fptmp);
return -1;
}
}
else
{
if(fprintf(fptmp,"%s",getbuf) < 0)
{
fclose(fp);
fclose(fptmp);
return -1;
}
}
}
fclose(fp);
//如果[section]不存在
if(section_find_flag != 0)
{
//写入[section]项
if(fprintf(fptmp,"%s\n",section_buf) < 0)
{
fclose(fptmp);
return -1;
}
//写入item项
if(fprintf(fptmp,"%s=%s\n",item,buf) < 0)
{
fclose(fptmp);
return -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -