1.#include <stdio.h> 2.#include <unistd.h> 3.#include <fcntl.h> 4.#include <string.h> 5.#include <malloc.h> 6.#include <stdlib.h> 7. 8. 9.typedef struct item_t { 10. char *key; 11. char *value; 12.}ITEM; 13. 14./* 15. *去除字符串右端空格 16. */ 17.char *strtrimr(char *pstr) 18.{ 19. int i; 20. i = strlen(pstr) - 1; 21. while (isspace(pstr[i]) && (i >= 0)) 22. pstr[i--] = '\0'; 23. return pstr; 24.} 25./* 26. *去除字符串左端空格 27. */ 28.char *strtriml(char *pstr) 29.{ 30. int i = 0,j; 31. j = strlen(pstr) - 1; 32. while (isspace(pstr[i]) && (i <= j)) 33. i++; 34. if (0<i) 35. strcpy(pstr, &pstr[i]); 36. return pstr; 37.} 38./* 39. *去除字符串两端空格 40. */ 41.char *strtrim(char *pstr) 42.{ 43. char *p; 44. p = strtrimr(pstr); 45. return strtriml(p); 46.} 47. 48. 49./* 50. *从配置文件的一行读出key或value,返回item指针 51. *line--从配置文件读出的一行 52. */ 53.int get_item_from_line(char *line, struct item_t *item) 54.{ 55. char *p = strtrim(line); 56. int len = strlen(p); 57. if(len <= 0){ 58. return 1;//空行 59. } 60. else if(p[0]=='#'){ 61. return 2; 62. }else{ 63. char *p2 = strchr(p, '='); 64. *p2++ = '\0'; 65. item->key = (char *)malloc(strlen(p) + 1); 66. item->value = (char *)malloc(strlen(p2) + 1); 67. strcpy(item->key,p); 68. strcpy(item->value,p2); 69. 70. } 71. return 0;//查询成功 72.} 73. 74.int file_to_items(const char *file, struct item_t *items, int *num) 75.{ 76. char line[1024]; 77. FILE *fp; 78. fp = fopen(file,"r"); 79. if(fp == NULL) 80. return 1; 81. int i = 0; 82. while(fgets(line, 1023, fp)) 83. { 84. char *p = strtrim(line); 85. int len = strlen(p); 86. if(len <= 0) 87. { 88. continue; 89. } 90. else if(p[0]=='#') 91. { 92. continue; 93. } 94. else 95. { 96. char *p2 = strchr(p, '='); 97. /*这里认为只有key没什么意义*/ 98. if(p2 == NULL) 99. continue; 100. *p2++ = '\0'; 101. items[i].key = (char *)malloc(strlen(p) + 1); 102. items[i].value = (char *)malloc(strlen(p2) + 1); 103. strcpy(items[i].key,p); 104. strcpy(items[i].value,p2); 105. 106. i++; 107. } 108. } 109. (*num) = i; 110. fclose(fp); 111. return 0; 112.} 113. 114./* 115. *读取value 116. */ 117.int read_conf_value(const char *key,char *value1,const char *file) 118.{ 119. char line[1024]; 120. char *key1,*key3,*key2; 121. FILE *fp; 122. fp = fopen(file,"r"); 123. if(fp == NULL) 124. return 1;//文件打开错误 125. while (fgets(line, 1023, fp)){ 126. ITEM item; 127. get_item_from_line(line,&item); 128. if(!strcmp(item.key,key)){ 129. 130. strcpy(value1,item.value); 131. fclose(fp); 132. free(item.key); 133. free(item.value); 134. break; 135. } 136. } 137. return 0;//成功 138. 139.} 140.int write_conf_value(const char *key,char *value,const char *file) 141.{ 142. ITEM items[20];// 假定配置项最多有20个 143. int num;//存储从文件读取的有效数目 144. file_to_items(file, items, &num); 145. 146. int i=0; 147. //查找要修改的项 148. for(i=0;i<num;i++){ 149. if(!strcmp(items[i].key, key)){ 150. items[i].value = value; 151. break; 152. } 153. } 154. 155. // 更新配置文件,应该有备份,下面的操作会将文件内容清除 156. FILE *fp; 157. fp = fopen(file, "w"); 158. if(fp == NULL) 159. return 1; 160. 161. i=0; 162. for(i=0;i<num;i++){ 163. fprintf(fp,"%s=%s\n",items[i].key, items[i].value); 164. //printf("%s=%s\n",items[i].key, items[i].value); 165. } 166. fclose(fp); 167. //清除工作 168. /*i=0; 169. for(i=0;i<num;i++){ 170. free(items[i].key); 171. free(items[i].value); 172. }*/ 173. 174. return 0; 175. 176.} 177. 178.void main(void) 179.{ 180. char *key; 181. char *value=NULL,*value1=NULL; 182. char *file; 183. file="/home/wangwei/ww/file/from_file"; 184. 185. key="IP"; 186. value=(char *)malloc(sizeof(char)*30); 187. value1=(char *)malloc(sizeof(char)*30); 188. read_conf_value(key,value,file); 189. printf("IP = %s\n",value); 190. 191. key="MASK"; 192. read_conf_value(key,value,file); 193. printf("MASK = %s\n",value); 194. 195. key="GATEWAY"; 196. read_conf_value(key,value,file); 197. printf("GATEWAY = %s\n",value); 198. free(value); 199. free(value1); 200. value=NULL; 201. value1=NULL; 202.}
作者:江南烟雨居
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。