整理自网络
来源:http://blog.csdn.net/oyd/article/details/5005735
读取一个文件,类似
IP=192.168.1.8 NETMASK=255.255.255.0 格式的文件,并对文件进行解析,得到其key和value,可以读取相应key的value值,也可以得到配置相应的value; typedef struct item_t { char * key; char * value;}ITEM; /* *去除字符串右端空格 */ char * strtrimr( char * pstr){ int i; i = strlen(pstr) - 1 ; while (isspace(pstr[i]) && (i >= 0 )) pstr[i -- ] = ' \0 ' ; return pstr;} /* *去除字符串左端空格 */ char * strtriml( char * pstr){ int i = 0 ,j; j = strlen(pstr) - 1 ; while (isspace(pstr[i]) && (i <= j)) i ++ ; if ( 0 < i) strcpy(pstr, & pstr[i]); return pstr;} /* *去除字符串两端空格 */ char * strtrim( char * pstr){ char * p; p = strtrimr(pstr); return strtriml(p);} /* *从配置文件的一行读出key或value,返回item指针 *line--从配置文件读出的一行 */ int get_item_from_line( char * line, out ITEM * item){ char * p = strtrim(line); int len = strlen(p); if (len <= 0 ){ return 1 ; // 空行 } else if (p[ 0 ] == ' # ' ){ return 2 ; } else { char * p2 = strchr(p, ' = ' ); * p2 ++ = ' \0 ' ; item -> key = ( char * )malloc(strlen(p) + 1 ); item -> value = ( char * )malloc(strlen(p2) + 1 ); strcpy(item -> key,p); strcpy(item -> value,p2); } return 0 ; // 查询成功 } int file_to_items( const char * file, out ITEM * items, out int * num){ char line[ 1024 ]; FILE * fp; fp = fopen(file, " r " ); if (fp == NULL) return 1 ; int i = 0 ; while (fgets(line, 1023 , fp)){ char * p = strtrim(line); int len = strlen(p); if (len <= 0 ){ continue ; } else if (p[ 0 ] == ' # ' ){ continue ; } else { char * p2 = strchr(p, ' = ' ); /* 这里认为只有key没什么意义 */ if (p2 == NULL) continue ; * p2 ++ = ' \0 ' ; items[i].key = ( char * )malloc(strlen(p) + 1 ); items[i].value = ( char * )malloc(strlen(p2) + 1 ); strcpy(items[i].key,p); strcpy(items[i].value,p2); i ++ ; } } ( * num) = i; fclose(fp); return 0 ;} /* *读取value */ int read_conf_value( const char * key, out char * value, const char * file){ char line[ 1024 ]; FILE * fp; fp = fopen(file, " r " ); if (fp == NULL) return 1 ; // 文件打开错误 while (fgets(line, 1023 , fp)){ ITEM item; get_item_from_line(line, & item); if ( ! strcmp(item.key,key)){ strcpy(value,item.value); fclose(fp); free(item.key); free(item.value); break ; } } return 0 ; // 成功 } int write_conf_value( const char * key, char * value, const char * file){ ITEM items[ 20 ]; // 假定配置项最多有20个 int num; // 存储从文件读取的有效数目 file_to_items(file, items, & num); int i = 0 ; // 查找要修改的项 for (i = 0 ;i < num;i ++ ){ if ( ! strcmp(items[i].key, key)){ items[i].value = value; break ; } } // 更新配置文件,应该有备份,下面的操作会将文件内容清除 FILE * fp; fp = fopen(file, " w " ); if (fp == NULL) return 1 ; i = 0 ; for (i = 0 ;i < num;i ++ ){ fprintf(fp, " %s=%s\n " ,items[i].key, items[i].value); // printf("%s=%s\n",items[i].key, items[i].value); } fclose(fp); // 清除工作 /* i=0; for(i=0;i<num;i++){ free(items[i].key); free(items[i].value); } */ return 0 ;}