linux下配置文件的读写

本文介绍如何读取和解析IP、网关等配置文件格式,并提供了解析后的key和value操作方法,包括读取特定key对应的value及修改配置文件内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来自: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;

复制代码
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; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值