Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135108
  • 博文数量: 32
  • 博客积分: 582
  • 博客等级: 中士
  • 技术积分: 291
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-24 22:38
文章分类

全部博文(32)

文章存档

2012年(3)

2011年(29)

我的朋友

分类: LINUX

2011-12-14 17:54:12

源出处:http://www.cnblogs.com/hoys/archive/2011/04/25/2026828.html
读取一个文件,类似
  IP=192.168.1.8
 NETMASK=255.255.255.0
格式的文件,并对文件进行解析,得到其key和value,可以读取相应key的value值,也可以得到配置相应的value;
  1. typedef struct item_t {
  2.     char *key;
  3.     char *value;
  4. }ITEM;

  5. /*
  6.  *去除字符串右端空格
  7.  */
  8. char *strtrimr(char *pstr)
  9. {
  10.     int i;
  11.     i = strlen(pstr) - 1;
  12.     while (isspace(pstr[i]) && (i >= 0))
  13.         pstr[i--] = '\0';
  14.     return pstr;
  15. }
  16. /*
  17.  *去除字符串左端空格
  18.  */
  19. char *strtriml(char *pstr)
  20. {
  21.     int i = 0,j;
  22.     j = strlen(pstr) - 1;
  23.     while (isspace(pstr[i]) && (i <= j))
  24.         i++;
  25.     if (0<i)
  26.         strcpy(pstr, &pstr[i]);
  27.     return pstr;
  28. }
  29. /*
  30.  *去除字符串两端空格
  31.  */
  32. char *strtrim(char *pstr)
  33. {
  34.     char *p;
  35.     p = strtrimr(pstr);
  36.     return strtriml(p);
  37. }

  38. /*
  39.  *从配置文件的一行读出key或value,返回item指针
  40.  *line--从配置文件读出的一行
  41.  */
  42. int get_item_from_line(char *line, out ITEM *item)
  43. {
  44.     char *p = strtrim(line);
  45.     int len = strlen(p);
  46.     if(len <= 0){
  47.         return 1;//空行
  48.     }
  49.     else if(p[0]=='#'){
  50.         return 2;
  51.     }else{
  52.         char *p2 = strchr(p, '=');
  53.         *p2++ = '\0';
  54.         item->key = (char *)malloc(strlen(p) + 1);
  55.         item->value = (char *)malloc(strlen(p2) + 1);
  56.         strcpy(item->key,p);
  57.         strcpy(item->value,p2);

  58.         }
  59.     return 0;//查询成功
  60. }

  61. int file_to_items(const char *file, out ITEM *items, out int *num)
  62. {
  63.     char line[1024];
  64.     FILE *fp;
  65.     fp = fopen(file,"r");
  66.     if(fp == NULL)
  67.         return 1;
  68.     int i = 0;
  69.     while(fgets(line, 1023, fp)){
  70.             char *p = strtrim(line);
  71.         int len = strlen(p);
  72.         if(len <= 0){
  73.             continue;
  74.         }
  75.         else if(p[0]=='#'){
  76.             continue;
  77.         }else{
  78.             char *p2 = strchr(p, '=');
  79.             /*这里认为只有key没什么意义*/
  80.             if(p2 == NULL)
  81.                 continue;
  82.             *p2++ = '\0';
  83.             items[i].key = (char *)malloc(strlen(p) + 1);
  84.             items[i].value = (char *)malloc(strlen(p2) + 1);
  85.             strcpy(items[i].key,p);
  86.             strcpy(items[i].value,p2);

  87.             i++;
  88.         }
  89.     }
  90.     (*num) = i;
  91.     fclose(fp);
  92.     return 0;
  93. }

  94. /*
  95.  *读取value
  96.  */
  97. int read_conf_value(const char *key,out char *value,const char *file)
  98. {
  99.     char line[1024];
  100.     FILE *fp;
  101.     fp = fopen(file,"r");
  102.     if(fp == NULL)
  103.         return 1;//文件打开错误
  104.     while (fgets(line, 1023, fp)){
  105.         ITEM item;
  106.         get_item_from_line(line,&item);
  107.         if(!strcmp(item.key,key)){
  108.             strcpy(value,item.value);

  109.             fclose(fp);
  110.             free(item.key);
  111.             free(item.value);
  112.             break;
  113.         }

  114.     }
  115.     return 0;//成功

  116. }
  117. int write_conf_value(const char *key,char *value,const char *file)
  118. {
  119.     ITEM items[20];// 假定配置项最多有20个
  120.     int num;//存储从文件读取的有效数目
  121.     file_to_items(file, items, &num);

  122.     int i=0;
  123.     //查找要修改的项
  124.     for(i=0;i<num;i++){
  125.         if(!strcmp(items[i].key, key)){
  126.             items[i].value = value;
  127.             break;
  128.         }
  129.     }

  130.     // 更新配置文件,应该有备份,下面的操作会将文件内容清除
  131.     FILE *fp;
  132.     fp = fopen(file, "w");
  133.     if(fp == NULL)
  134.         return 1;

  135.     i=0;
  136.     for(i=0;i<num;i++){
  137.         fprintf(fp,"%s=%s\n",items[i].key, items[i].value);
  138.         //printf("%s=%s\n",items[i].key, items[i].value);
  139.     }
  140.     fclose(fp);
  141.     //清除工作
  142. /* i=0;
  143.     for(i=0;i<num;i++){
  144.         free(items[i].key);
  145.         free(items[i].value);
  146.     }*/

  147.     return 0;

  148. }

阅读(1064) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~