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.} |