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;
  else{
   if(ori<33)
    continue;
   else{
    tmp[j]=ori;
    qq=1;
   }
  }
  j++;
 }
 tmp[j]='/0';

 j=qq=0;
 for(i=strlen(tmp)-1;i>;=0;i--){
  if(qq==1)
   trim[j]=tmp;
  else{
   if(tmp<33)
    continue;
   else{
    trim[j]=tmp;
    qq=1;
   }
  }
  j++;
 }
 trim[j]='/0';
 j=strlen(trim);
 for(i=0;i<j;i++){
  tmp=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=='#')||(lineBuf==';'))
   break;
 }
 if(i==0)
  return 1;
 lineBuf='/0';
 tlen=strlen(lineBuf);
 for(i=0;i<tlen;i++){
  if(lineBuf=='='){
   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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值