标准C处理类似INI配置文件的键值型文档

来源:互联网 发布:hadoop2.9.0 windows 编辑:程序博客网 时间:2024/06/05 20:13

Linux下处理配置文档经常是个让人头痛的问题, 因为它不像Win32平台有INI文件处理的API或类对象, 这样, 我们就只能以字符流的方式来分析处理了, 下面的程序段实现了一个典型的处理配置文档的方法...
  /*
   读取并处理键值型文档
  */
  char name[20];
  byte age;
  char sex[8];
  int PropertyConfigurator (char *configFilename)
  {
   FILE* fp;
   int i;
   char line[256];
   char* pstr=(char*)NULL;
  
   if((fp = fopen(configFilename, "r")) == (FILE*)NULL) // configFileName是欲处理的配置文件名
   {
   printf("Can not open configfile/n"); // 是配置文档中的注释
   return 0;
   }
  
   else
   {
   while(fgets(line, 256, fp) !=(char*)NULL)
   {
   DeteteWhiteSpace(line); // Delete spaces
   if(line[0] == '#'); // '#' 是配置文档中的注释行
   continue;
   strupr(line); // Convert character to lowercase.
   if(pstr = strstr(line, "NAME")) // Process key-value
   {
   pstr = strstr(line, '=');
   DeteteWhiteSpace(++pstr);
   strcpy(name, pstr);
   }
  
   if(pstr = strstr(line, "AGE")) // Process key-value
   {
   pstr = strstr(line, '=');
   DeteteWhiteSpace(++pstr);
   age = atoi(pstr);
   }
   else if((pstr = strstr(line, "SEX"))) // Process key-value
   {
   pstr=strstr(line, '=');
   DeteteWhiteSpace(++pstr);
   strcpy(sex, pstr);
   }
   }
   }
  
   fclose(fp);
   return 1;
  }
  /*
   标准C不提供的两个函数
   itoa 将数字字符串转换成数值类型
   strupr 将字符串中的字符转换成大写
  */
  char* itoa(long value, char *string)
  { // Enough for a 128 bit integer
   if (string)
   sprintf(string, "%d", value);
   return string;
  }
  char* strupr(char *string)
  {
   if (string != NULL)
   {
   char *cp; // traverses string for C locale conversion */
   for (cp = string; *cp; ++cp)
   {
   if ('a' <= *cp && *cp <= 'z')
   *cp += 'A' - 'a';
   }
   return(string);
   } //C locale
   return NULL;
  }
  /*
   附加函数
   删除配置文档中的空行及空格
  */
  char* DeteteWhiteSpace(char* str) // Delete space
  {
   char strTemp[256];
   char strTemp2[256];
   unsigned int i,j;
   memset(strTemp, 0, 256);
   strcpy(strTemp2, str);
   j = 0;
   if (str != NULL)
   {
   for(i=0; i<strlen(str); i++)
   {
   if (strTemp2[i] != ' ')
   {
   strTemp[j++] = strTemp2[i];
   }
   }
   }
   strcpy(str, strTemp);
   return(str);
  }