zoukankan      html  css  js  c++  java
  • linux下配置文件的读写

    读取一个文件,类似
      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;

    }
  • 相关阅读:
    (轻松一刻)神秘而又强大的蓝翔学院!而且还是当中最可怕的挖掘机系!
    IIS 反向代理二级目录及泛目录
    正则表达式匹配外链和内链
    关于 preg_replace_callbank 的学习记录
    Linux 笔记
    Linux 笔记
    Linux 笔记
    使用 Docker 安装 showdoc
    Docker 入门
    Linux 笔记
  • 原文地址:https://www.cnblogs.com/hoys/p/2026828.html
Copyright © 2011-2022 走看看