- 论坛徽章:
- 0
|
在Linux中有直接读写配置文件的各个键值的接口嘛?
- /
- *********************************************
- FileName: FileScan.c
- Describe: Functions For Read Config File
- Author: Eboy
- Date: 2003.8.28
- ****************************************************/
- #ifdef _WINDOWS_
- #include <windows.h>;
- #include <winbase.h>;
- #endif
- #include <stdio.h>;
- #include <stdlib.h>;
- #include <string.h>;
- #define CONF_FILE_MAX_LINE 50
- #define CONF_FILE_MAX_ROW 100
- /*
- * 函数名:IsBreakChar()
- * 功能: 判断是否为行结束符
- * 返回值:1表示真,0表示假
- * 参数说明:char ch 需要判断的字符
- *
- */
- int IsBreakChar(char ch)
- {
- if(ch==9) //Tab Key
- return 0;
- if((ch<32)&&(ch>;0))
- return 1;
- else
- return 0;
- }
- /*
- * 函数名:ReadLine()
- * 功能: 从文件中读出一行
- * 参数说明:FILE* fpt 文件描述符
- * char* linestr 输出数据,结尾为'\0'的字符串
- */
- int ReadLine(FILE* fpt, char *linestr)
- {
- int i,rv;
- char cc;
- char buf[CONF_FILE_MAX_ROW];
- if(feof(fpt)){
- return 1;
- }
- for(i=0;i<CONF_FILE_MAX_ROW;i++){
- rv=fread(&cc,1,1,fpt);
- if(rv<1)
- break;
- if(IsBreakChar(cc)==1)
- break;
- buf[i]=cc;
- }
- buf[i]='\0';
- strcpy(linestr,buf);
- return 0;
- }
- /*
- * 函数名:TrimSpace()
- * 功能: 将字符串中的空格删除
- * 参数说明:char_PTR ori 输入字符串
- * char * trim 输出字符串
- */
- int TrimSpace(char * ori,char * trim)
- {
- int i,j,qq,len;
- char tmp[CONF_FILE_MAX_ROW];
- j=qq=0;
- len=strlen(ori);
- for(i=0;i<len;i++){
- if(qq==1)
- tmp[j]=ori[i];
- else{
- if(ori[i]<33)
- continue;
- else{
- tmp[j]=ori[i];
- qq=1;
- }
- }
- j++;
- }
- tmp[j]='\0';
- j=qq=0;
- for(i=strlen(tmp)-1;i>;=0;i--){
- if(qq==1)
- trim[j]=tmp[i];
- else{
- if(tmp[i]<33)
- continue;
- else{
- trim[j]=tmp[i];
- qq=1;
- }
- }
- j++;
- }
- trim[j]='\0';
- j=strlen(trim);
- for(i=0;i<j;i++){
- tmp[i]=trim[j-i-1];
- }
- memcpy(trim,tmp,j);
- return 0;
- }
- /*
- * 函数名:ReadSector()
- * 功能: 从输入字符串中分解出指定项的值
- * 返回值: 如果成功返回0
- * 参数说明:char * line 输入字符串
- * char * SectName 指定域的名称
- * char * SectVa 输出指定域的值(返回成功时有效)
- */
- int ReadSector(char * line,char * SectName,char * SectVal)
- {
- int i;
- int tlen,equpos=0;
- char lineBuf[CONF_FILE_MAX_ROW];
- char oriSectName[CONF_FILE_MAX_ROW],tmpSectName[CONF_FILE_MAX_ROW];
- char oriSectVal[CONF_FILE_MAX_ROW];
-
- TrimSpace(line,lineBuf);
- tlen=strlen(lineBuf);
- for(i=0;i<tlen;i++){
- if((lineBuf[i]=='#')||(lineBuf[i]==';'))
- break;
- }
- if(i==0)
- return 1;
- lineBuf[i]='\0';
- tlen=strlen(lineBuf);
- for(i=0;i<tlen;i++){
- if(lineBuf[i]=='='){
- equpos=i;
- break;
- }
- }
- if(equpos==0)
- return 1;
- memcpy(oriSectName,lineBuf,equpos);
- oriSectName[equpos]='\0';
- TrimSpace(oriSectName,tmpSectName);
- if((SectName[0]=='#')||(SectName[0]==';')){
- return 1;
- }
- if(strcmp(tmpSectName,SectName))
- return 1;
- memcpy(oriSectVal,lineBuf+equpos+1,tlen-equpos-1);
- oriSectVal[tlen-equpos-1]='\0';
- TrimSpace(oriSectVal,SectVal);
- return 0;
- }
- /*
- * 函数名:AnalizeConfFile()
- * 功能: 从指定文件中分解出指定域的值
- * 返回值: 如果成功返回0
- * 参数说明:char * Filename 指定配置文件名
- * char * SectName 指定域的名称
- * char * SectVa 输出指定域的值(返回成功时有效)
- */
- int AnalizeConfFile(char * Filename,char * sector,char * sectval)
- {
- int i,rv,flag=0;
- FILE *fp;
- char line[CONF_FILE_MAX_LINE];
- char syspath[256];
- #ifdef _WINDOWS_
- if(Filename!=NULL)
- strcpy(syspath,Filename);
- if(Filename == NULL)
- {
- if ((rv = GetSystemDirectory(syspath,256))<=0)
- {
- ErrorLocation;
- return 1;
- }
- if (rv >; 3)
- strcat(syspath,"/MyFile.ini");
- else
- strcat(syspath,"MyFile.ini");
- //#endif
- }
- #else
- if(Filename != NULL)
- {
- strcpy(syspath,Filename);
- }
- if(Filename ==NULL)
- {
- strcpy(syspath,"/etc/MyFile.ini");
- }
- #endif
- fp=fopen(syspath,"r");
- if(fp==NULL)
- {
- return 1;
- }
- for(i=0;i<CONF_FILE_MAX_LINE;i++)
- {
- rv = ReadLine(fp,line);
- if(rv != 0)
- break;
- if(ReadSector(line,sector,sectval)==0)
- {
- flag = 1;
- break;
- }
- }
- if (flag == 0)
- return -1;
- fclose(fp);
- return 0;
- }
复制代码
使用时直接调用AnalizeConfFile函数即可。 |
|