- 论坛徽章:
- 0
|
读取ini文件的例子(原创)
- #ifndef tini_h
- #define tini_h
- #ifndef tmemlist_h
- #include <memlist.h>;
- #endif
- typedef struct
- {
- char * Name;
- char * Value;
- char * Comment;
- }IniItemStru;
- class TIniSet
- {
- private:
- public:
- TMemList * mList;
- char * mName;
- char * mComment;
- private:
- void FreeItem(IniItemStru * obj);
- public:
- TIniSet();
- ~TIniSet();
- void SetInfo(char * setname,char * comment);
- int GoHead();
- int HaveNext();
- int Next();
- IniItemStru * GetItem();
- IniItemStru * GetItem(char * item);
- char * GetKey(char * item);
- int AddItem(char * item,char * key,char * comment);
- int SetKey(char * item,char * key);
- void RemoveKey(char * item,char * key);
- void RemoveItem(char * item);
- };
- class TIni
- {
- private:
- char mComment_Flag;
- public:
- TMemList * mList;
- private:
- int IniSeperate(char * line,char * name,char * value,char * comment);
- public:
- TIni();
- ~TIni();
- void SetComment(char );
- TIniSet * GetSet(char * grpname);
- TIniSet * AddSet(char * grpname,char * comment);
- int RemoveSet(char * grpname);
- int AddItem(char * grpname,char * item,char * key,char * comment);
- int SetKey(char * grpname,char * item,char * key);
- void RemoveKey(char * grpname,char * item,char * key);
- void RemoveItem(char * grpname,char * item);
- IniItemStru * GetItem(char * grpname,char * item);
- char * GetKey(char * grpname,char * item);
- int GetItemKey(char * grpname,char * item,char * pkeyval);
- char * GetKey(char * ininame,char * grpname,char * item);
- int GetItemKey(char * ininame,char * grpname,char * item,char * pkeyval);
- int SaveToFile(char * filename);
- int LoadFile(char * filename);
- };
- #endif
- /***************************************************************
- * 模块名称:cini.cpp
- * 功能描述:配置文件操作类
- * 关键算法:
- * 可移植性: unix / window / c++
- * 外部引用:cini.h
- * 作 者: mengwg
- * 完工日期: 2001-02-25
- * 最后修改日期: 2001-02-25
- * 修改记录:
- * 修改者:
- * 修改描述:
- * 修改日期:
- *
- * 修改者:
- * 修改描述:
- * 修改日期:
- ***************************************************************/
- #include <system.h>;
- #include <stdio.h>;
- #include <stdlib.h>;
- #include <string.h>;
- #include <ctype.h>;
- #include <cini.h>;
- #include <tbase.h>;
- /*******************************************************************
- * 下面是TIniSet类的成员函数
- *******************************************************************/
- /*
- 函数功能:释放一个节点
- 传入参数:
- obj: 要释放的节点
- 返回参数:
- */
- void TIniSet::FreeItem(IniItemStru * obj)
- {
- if(obj==NULL) return;
- if(obj->;Name!=NULL) IMem.Free(obj->;Name);
- if(obj->;Value!=NULL) IMem.Free(obj->;Value);
- if(obj->;Comment!=NULL) IMem.Free(obj->;Comment);
- IMem.Free(obj);
- }
- /*
- 函数功能:初始化
- 传入参数:
- 返回参数:
- */
- TIniSet::TIniSet()
- {
- mName = NULL;
- mComment = NULL;
- mList = new TMemList();
- }
- /*
- 函数功能:释放内存
- 传入参数:
- 返回参数:
- */
- TIniSet::~TIniSet()
- {
- IniItemStru * obj;
- if(mName != NULL) IMem.Free(mName);
- if(mComment != NULL) IMem.Free(mComment);
- while(mList->;GoHead())
- {
- obj = (IniItemStru * )mList->;GetPtr();
- mList->;Remove(obj);
- FreeItem(obj);
- };
- delete mList;
- }
- /*
- 函数功能:设置集合的名称和注释
- 传入参数:
- setname: 集合名称
- comment: 集合注释
- 返回参数:
- */
- void TIniSet::SetInfo(char * setname,char * comment)
- {
- if(mName != NULL)
- {
- IMem.Free(mName);
- mName=NULL;
- };
- if(mComment != NULL)
- {
- IMem.Free(mComment);
- mComment=NULL;
- };
- if(setname!=NULL)
- {
- mName = (char *)IMem.Malloc((int)strlen(setname)+1);
- strcpy(mName,setname);
- };
- if(comment!=NULL)
- {
- mComment = (char *)IMem.Malloc((int)strlen(comment)+1);
- strcpy(mComment,comment);
- };
- }
- /*
- 函数功能:到集合头
- 传入参数:
- 返回参数:
- 成功 1
- 失败 0
- */
- int TIniSet::GoHead()
- {
- return mList->;GoHead();
- }
- /*
- 函数功能:判断集合是否有下一条目
- 传入参数:
- 返回参数:
- 有 1
- 无 0
- */
- int TIniSet::HaveNext()
- {
- return mList->;HaveNext();
- }
- /*
- 函数功能:定位到集合的下一条目
- 传入参数:
- 返回参数:
- 有 1
- 无 0
- */
- int TIniSet::Next()
- {
- return mList->;Next();
- }
- /*
- 函数功能:取集合的当前条目
- 传入参数:
- 返回参数:
- 成功 返回条目
- 失败 返回NULL
- */
- IniItemStru * TIniSet::GetItem()
- {
- return (IniItemStru * )mList->;GetPtr();
- }
- /*
- 函数功能:根据名称取一个条目
- 传入参数:
- item: 条目名称
- 返回参数:
- 成功:节点指针
- 失败:NULL
- */
- IniItemStru * TIniSet::GetItem(char * item)
- {
- IniItemStru * obj;
- if(item==NULL) return NULL;
- mList->;GoHead();
- while(1)
- {
- obj = (IniItemStru * )mList->;GetPtr();
- if(obj==NULL) break;
- if(obj->;Name==NULL)
- {
- if(!mList->;Next()) break;
- continue;
- };
- if(!strcmp(obj->;Name,item))
- return obj;
- if(!mList->;Next()) break;
- };
- return NULL;
- }
- /*
- 函数功能:根据名称取一个条目的值
- 传入参数:
- item: 条目名称
- 返回参数:
- 成功:条目的值
- 失败:NULL
- */
- char * TIniSet::GetKey(char * item)
- {
- IniItemStru * obj;
- if(item==NULL) return NULL;
- mList->;GoHead();
- while(1)
- {
- obj = (IniItemStru * )mList->;GetPtr();
- if(obj==NULL) break;
- if(obj->;Name==NULL)
- {
- if(!mList->;Next()) break;
- continue;
- };
- //printf("objname %s item %s\n",obj->;Name,item);
- if(!strcmp(obj->;Name,item))
- return obj->;Value;
- if(!mList->;Next()) break;
- };
- return NULL;
- }
- /*
- 函数功能:在集合里添加一个条目
- 传入参数:
- item: 条目名称
- key: 条目的值
- comment: 条目的注释
- 返回参数:
- 成功 1
- 失败 0
- */
- int TIniSet::AddItem(char * item,char * key,char * comment)
- {
- IniItemStru * obj;
- obj=(IniItemStru * )IMem.Malloc(sizeof(IniItemStru));
- if(obj==NULL) goto malloc_err;
- obj->;Name=obj->;Value=obj->;Comment=NULL;
- if(item!=NULL)
- {
- obj->;Name=(char *)IMem.Malloc((int)strlen(item)+1);
- if(obj->;Name==NULL) goto malloc_err;
- strcpy(obj->;Name,item);
- };
- if(key!=NULL)
- {
- obj->;Value=(char *)IMem.Malloc((int)strlen(key)+1);
- if(obj->;Value==NULL) goto malloc_err;
- strcpy(obj->;Value,key);
- };
- if(comment!=NULL)
- {
- obj->;Comment=(char *)IMem.Malloc((int)strlen(comment)+1);
- if(obj->;Comment==NULL) goto malloc_err;
- strcpy(obj->;Comment,comment);
- };
- if(mList->;AddTail(obj))
- return 1;
- malloc_err:
- FreeItem(obj);
- return 0;
- }
- /*
- 函数功能:设置一个条目的值
- 传入参数:
- item: 条目名称
- key: 条目的值
- 返回参数:
- 成功 1
- 失败 0
- */
- int TIniSet::SetKey(char * item,char * key)
- {
- IniItemStru * obj;
- if(item==NULL) return 0;
- mList->;GoHead();
- while(1)
- {
- obj = (IniItemStru * )mList->;GetPtr();
- if(obj==NULL) break;
- if(obj->;Name==NULL)
- {
- if(!mList->;Next()) break;
- continue;
- };
- if(strcmp(obj->;Name,item))
- {
- if(!mList->;Next()) break;
- continue;
- };
- if(obj->;Value==NULL)
- {
- IMem.Free(obj->;Value);
- obj->;Value=NULL;
- };
- if(key!=NULL)
- {
- obj->;Value=(char *)IMem.Malloc((int)strlen(key)+1);
- strcpy(obj->;Value,key);
- return 1;
- };
- if(!mList->;Next()) break;
- };
- AddItem(item,key,NULL);
- return 1;
- }
- /*
- 函数功能:根据值删除一个条目
- 传入参数:
- item: 条目名称
- key: 条目的值
- 返回参数:
- */
- void TIniSet::RemoveKey(char * item,char * key)
- {
- IniItemStru * obj;
- if(item==NULL||key==NULL) return;
- mList->;GoHead();
- while(1)
- {
- obj = (IniItemStru * )mList->;GetPtr();
- if(obj==NULL) break;
- if(obj->;Name==NULL||obj->;Value==NULL)
- {
- if(!mList->;Next()) break;
- continue;
- };
- if(!strcmp(obj->;Name,item)&&!strcmp(obj->;Value,key))
- {
- mList->;Remove(obj);
- FreeItem(obj);
- continue;
- };
- if(!mList->;Next()) break;
- };
- }
- /*
- 函数功能:根据名称删除一个条目
- 传入参数:
- item: 条目名称
- 返回参数:
- */
- void TIniSet::RemoveItem(char * item)
- {
- IniItemStru * obj;
- if(item==NULL) return;
- mList->;GoHead();
- while(1)
- {
- obj = (IniItemStru * )mList->;GetPtr();
- if(obj==NULL) break;
- if(obj->;Name==NULL)
- {
- if(!mList->;Next()) break;
- continue;
- };
- if(!strcmp(obj->;Name,item))
- {
- mList->;Remove(obj);
- FreeItem(obj);
- continue;
- };
- if(!mList->;Next()) break;
- };
- }
- /*******************************************************************
- * 下面是TIni类的成员函数
- *******************************************************************/
- /*
- 函数功能:初始化
- 传入参数:
- 返回参数:
- */
- TIni::TIni()
- {
- mComment_Flag = ';';
- mList = new TMemList();
- }
- /*
- 函数功能:释放内存
- 传入参数:
- 返回参数:
- */
- TIni::~TIni()
- {
- TIniSet * obj;
- while(mList->;GoHead())
- {
- obj = (TIniSet * )mList->;GetPtr();
- mList->;Remove(obj);
- delete obj;
- };
- delete mList;
- }
- /*
- 函数功能:设置标识注释的字符
- 传入参数:
- flag: 标识注释的字符
- 返回参数:
- */
- void TIni::SetComment(char flag)
- {
- mComment_Flag = flag;
- }
- /*
- 函数功能:根据名称取一个集合指针
- 传入参数:
- grpname: 集合名称
- 返回参数:
- 成功:集合指针
- 失败:NULL
- */
- TIniSet * TIni::GetSet(char * grpname)
- {
- TIniSet * obj;
- if(grpname==NULL) return NULL;
- mList->;GoHead();
- while(1)
- {
- obj = (TIniSet * )mList->;GetPtr();
- if(obj==NULL) break;
- if(obj->;mName==NULL)
- {
- if(!mList->;Next()) break;
- continue;
- };
- if(!strcmp(obj->;mName,grpname))
- return obj;
- if(!mList->;Next()) break;
- };
- //printf("unable to get set %s\n",grpname);
- return NULL;
- }
- /*
- 函数功能:添加一个集合
- 传入参数:
- grpname: 集合名称
- comment: 集合注释
- 返回参数:
- 成功:集合指针
- 失败:NULL
- */
- TIniSet * TIni::AddSet(char * grpname,char * comment)
- {
- TIniSet * obj;
- obj=GetSet(grpname);
- if(obj!=NULL)
- {
- obj->;SetInfo(grpname,comment);
- return obj;
- };
- obj=new TIniSet();
- obj->;SetInfo(grpname,comment);
- if(!mList->;AddTail(obj))
- {
- delete obj;
- return NULL;
- };
- return obj;
- }
- /*
- 函数功能:根据集合名称删除一个集合
- 传入参数:
- grpname: 集合名称
- 返回参数:
- 成功:1
- 失败:0
- */
- int TIni::RemoveSet(char * grpname)
- {
- TIniSet * obj;
- obj=GetSet(grpname);
- if(obj==NULL) return 0;
- mList->;Remove(obj);
- delete obj;
- return 1;
- }
- /*
- 函数功能:在集合里添加一个条目
- 传入参数:
- grpname: 集合名称
- item: 条目名称
- key: 条目的值
- comment: 条目的注释
- 返回参数:
- 成功 1
- 失败 0
- */
- int TIni::AddItem(char * grpname,char * item,char * key,char * comment)
- {
- TIniSet * obj;
- obj=GetSet(grpname);
- if(obj==NULL) return 0;
- return obj->;AddItem(item,key,comment);
- }
- /*
- 函数功能:设置一个条目的值
- 传入参数:
- grpname: 集合名称
- item: 条目名称
- key: 条目的值
- 返回参数:
- 成功 1
- 失败 0
- */
- int TIni::SetKey(char * grpname,char * item,char * key)
- {
- TIniSet * obj;
- obj=GetSet(grpname);
- if(obj==NULL) return 0;
- return obj->;SetKey(item,key);
- }
- /*
- 函数功能:根据值删除一个条目
- 传入参数:
- grpname: 集合名称
- item: 条目名称
- key: 条目的值
- 返回参数:
- */
- void TIni::RemoveKey(char * grpname,char * item,char * key)
- {
- TIniSet * obj;
- obj=GetSet(grpname);
- if(obj==NULL) return;
- obj->;RemoveKey(item,key);
- }
- /*
- 函数功能:根据名称删除一个条目
- 传入参数:
- grpname: 集合名称
- item: 条目名称
- 返回参数:
- */
- void TIni::RemoveItem(char * grpname,char * item)
- {
- TIniSet * obj;
- obj=GetSet(grpname);
- if(obj==NULL) return;
- obj->;RemoveItem(item);
- }
- /*
- 函数功能:根据名称取一个条目
- 传入参数:
- grpname: 集合名称
- item: 条目名称
- 返回参数:
- 成功:节点指针
- 失败:NULL
- */
- IniItemStru * TIni::GetItem(char * grpname,char * item)
- {
- TIniSet * obj;
- obj=GetSet(grpname);
- if(obj==NULL) return NULL;
- return obj->;GetItem(item);
- }
- /*
- 函数功能:根据名称取一个条目的值
- 传入参数:
- grpname: 集合名称
- item: 条目名称
- 返回参数:
- 成功:条目的值
- 失败:NULL
- */
- char * TIni::GetKey(char * grpname,char * item)
- {
- TIniSet * obj;
- obj=GetSet(grpname);
- if(obj==NULL)
- {
- printf("unable to get set %s\n",grpname);
- return NULL;
- };
- return obj->;GetKey(item);
- }
- /*
- 函数功能:根据名称取一个条目的值
- 传入参数:
- grpname: 集合名称
- item: 条目名称
- pkeyval: 用于存放条目值的内存指针
- 返回参数:
- 成功:1,同时把条目的值存放在pkeyval的内存中
- 失败:0
- */
- int TIni::GetItemKey(char * grpname,char * item,char * pkeyval)
- {
- char * p;
- p=GetKey(grpname,item);
- if(p==NULL) return 0;
- strcpy(pkeyval,p);
- return 1;
- };
- /*
- 函数功能:根据名称取一个条目的值
- 传入参数:
- ininame: ini文件名称
- grpname: 集合名称
- item: 条目名称
- 返回参数:
- 成功:条目的值
- 失败:NULL
- */
- char * TIni::GetKey(char * ininame,char * grpname,char * item)
- {
- TIni ini;
- static char itemvalue[500];
- char * pos;
- itemvalue[0]=0;
- if(!ini.LoadFile(ininame))
- return itemvalue;
- pos = ini.GetKey(grpname,item);
- if(pos==NULL) return itemvalue;
- strcpy(itemvalue,pos);
- return itemvalue;
- }
- /*
- 函数功能:根据名称取一个条目的值
- 传入参数:
- ininame: ini文件名称
- grpname: 集合名称
- item: 条目名称
- 返回参数:
- 成功:1,同时把条目的值存放在pkeyval的内存中
- 失败:0
- */
- int TIni::GetItemKey(char * ininame,char * grpname,char * item,char * pkeyval)
- {
- char * p;
- p=GetKey(ininame,grpname,item);
- if(p==NULL) return 0;
- strcpy(pkeyval,p);
- return 1;
- };
- /*
- 函数功能:解析一行配置信息
- 传入参数:
- line: 原始信息
- name: 名称
- value:值
- comment:注释
- 返回参数:
- 定义的类型
- 如果是集合定义就返回 1
- 否则返回 0
- */
- int TIni::IniSeperate(char * line,char * name,char * value,char * comment)
- {
- char * pos;
- int isgrp=0;
- *name=*value=*comment=0;
- pos=line;
- while(*pos==' '||*pos==9) pos++;
- if(*pos=='[')
- {
- pos++;
- while(*pos==' '||*pos==9) pos++;
- while(*pos!=' '&&*pos!=9&&*pos!=']'&&*pos!=0)
- *name++=(char)tolower(*pos++);
- *name=0;
- while(*pos==' '||*pos==9||*pos==']') pos++;
- isgrp = 1;
- }
- else
- {
- while(*pos!='='&&*pos!=mComment_Flag&&*pos!=0&&*pos!=' '&&*pos!=9)
- *name++=(char)tolower(*pos++);
- *name=0;
- };
- while(*pos==' '||*pos==9||*pos=='=') pos++;
- while(*pos!=mComment_Flag&&*pos!=0)
- *value++=*pos++;
- *value=0;
- while(*pos==mComment_Flag) pos++;
- while(*pos!=0)
- *comment++=*pos++;
- *comment=0;
- return isgrp;
- }
- /*
- 函数功能:更新配置文件
- 传入参数:
- filename: 要保存的文件名
- 返回参数:
- 0 保存失败
- 1 保存成功
- */
- int TIni::SaveToFile(char * filename)
- {
- FILE * fp;
- TIniSet * grp;
- IniItemStru * item;
- fp=fopen(filename,"wt");
- if(fp==(FILE *) NULL)
- return 0;
- mList->;GoHead();
- while(1)
- {
- grp = (TIniSet * )mList->;GetPtr();
- if(grp==NULL) break;
- if(grp->;mName!=NULL)
- if(grp->;mName[0]!=0)
- fprintf(fp,"[%s]",grp->;mName);
- if(grp->;mComment!=NULL)
- {
- if(grp->;mComment[0]!=0)
- fprintf(fp," ;%s",grp->;mComment);
- };
- if(grp->;mName!=NULL||grp->;mComment!=NULL)
- fprintf(fp,"\n");
- grp->;GoHead();
- while(1)
- {
- item=grp->;GetItem();
- if(item==NULL)
- break;
- if(item->;Name!=NULL)
- if(item->;Name[0]!=0)
- fprintf(fp,"%s ",item->;Name);
- if(item->;Value!=NULL)
- if(item->;Value[0]!=0)
- fprintf(fp,"= %s",item->;Value);
- else
- fprintf(fp,"= ");
- if(item->;Comment!=NULL)
- if(item->;Comment[0]!=0)
- fprintf(fp," ;%s",item->;Comment);
- fprintf(fp,"\n");
- if(!grp->;Next()) break;
- };
- fprintf(fp,"\n");
- if(!mList->;Next()) break;
- };
- fclose(fp);
- return 1;
- }
- /*
- 函数功能:打开配置文件
- 传入参数:
- filename: 要打开的文件名
- 返回参数:
- 成功: 1
- 失败: 0
- */
- int TIni::LoadFile(char * filename)
- {
- FILE * fp;
- TIniSet * grp;
- int isgrp,len;
- char line[1024]={0,0,0},name[1024],value[1024],comment[1024];
- //在提取之前应该先清除一下,mengwg 2001-08-20 modi
- TIniSet * obj;
- while(mList->;GoHead())
- {
- obj = (TIniSet * )mList->;GetPtr();
- mList->;Remove(obj);
- delete obj;
- };
- fp=fopen(filename,"rt");
- if(fp==(FILE *) NULL)
- return 0;
- while(fgets(line,1024,fp)!=NULL)
- {
- IString.Allt(line);
- len=(int)strlen(line);
- while(len>;0)
- if(line[len-1]==0x0a||line[len-1]==0x0d)
- len--;
- else
- break;
- line[len]=0;
- if(len==0)
- continue;
- isgrp=IniSeperate(line,name,value,comment);
- len=(int)strlen(value);
- while(len>;0)
- if(value[len-1]==' ')
- len--;
- else
- break;
- value[len]=0;
- if(isgrp)
- {
- grp = AddSet(name,comment);
- if(grp==NULL)
- goto load_err;
- continue;
- };
- if(grp==NULL)
- {
- grp = AddSet(NULL,NULL);
- if(grp==NULL)
- goto load_err;
- };
- grp->;AddItem(name,value,comment);
- }
- fclose(fp);
- return 1;
- load_err:
- fclose(fp);
- return 0;
- }
- #ifdef TIni_Test
- #include <cini.h>;
- int main()
- {
- TIni ini;
- ini.LoadFile("test.ini");
- ini.RemoveSet("general");
- printf("key of mintermid is '%s'\n",ini.GetKey("general","mintermid"));
- printf("key of serialno is '%s'\n",ini.GetKey("general","serialno"));
- //ini.RemoveItem("general","serialno");
- //ini.RemoveSet("general");
- ini.SaveToFile("save.ini");
- getchar();
- return 1;
- }
- #endif
复制代码 |
|