配置文件读写案例

一. 配置文件读写案例实现分析

1、 功能划分

a) 界面测试(功能集成)

自己动手规划接口模型。

b) 配置文件读写

1)配置文件读(根据key,读取valude

2)配置文件写(输入keyvalude

3)配置文件修改(输入keyvalude

4)优化 ===》接口要求紧 模块要求松

二.代码实现

cfg_op.h

#ifndef __CFG_OP_H

#define __CFG_OP_H

#ifdef  __cplusplus
extern "C" {
#endif
//写配置项
int writeCfg(const char *filename,const char*key,const char*value);
//读配置项
int readCfg(const char *filename,const char*key, char*value);

//去除字符串中前后的空格
int trimSpace(char*inStr,char*out);  

#ifdef  __cplusplus
}

#endif
#endif
cfg_op.c

#include 
#include 
#include 

#define MaxLine 2048
//读配置项
int readCfg(const char *filename,const char*key, char*valuebuf)
{
    int ret = 0;
    FILE *fp = NULL;
    char buf[MaxLine];
    char* tmp =NULL;
    fp = fopen(filename,"r");
    if (fp == NULL)
    {
        ret = -1;
        return ret;
    }
    //key1  =    abcdefg
    while (!feof(fp))
    {
        memset(buf,0,sizeof(buf));

        fgets(buf,MaxLine,fp);
    //    printf("buf:%s",buf);
        tmp = strchr(buf,'=');
        if (tmp==NULL)//没有等号
        {
            continue;
        }
        tmp = strstr(buf,key);//判断所在行是否有key
        if (tmp == NULL)
        {
            continue;
        }
        tmp = tmp + strlen(key);
        tmp = strchr(tmp,'=');
        if (tmp == NULL)
        {
            continue;
        }
        tmp = tmp+1;
        //去除tmp前后空格
        ret = trimSpace(tmp,valuebuf);
        if (ret!=0)
        {
            printf("func trimSpace() err :%d\n",ret);
            return ret ;
        }
    } 
    return ret;
}

//写配置项
//实现流程
//循环读取每一行,检查key配置项是否存在,若存在则修改对应的value
//若不存在,在文件末尾添加  key=value

int writeCfg(const char *filename,const char*key,const char*valuebuf)
{
    int ret = 0,iTag = 0,length=0;
    FILE *fp = NULL;
    char linebuf[MaxLine];
    char* tmp =NULL;
    char filebuf[1024*8]={0};

    if (filename==NULL||key==NULL||valuebuf==NULL)
    {
        printf("func writeCfg() param err\n");
        ret = -1;
        return ret;
    }
    fp = fopen(filename,"a+");//读写的方式打开文件
    if (fp == NULL)
    {
        ret = -1;
        printf("func fopen err:%d\n",ret);
        return ret;
    }
    fseek(fp,0L,SEEK_END);//文件指针定位到文件末尾
    length = ftell(fp);
    fseek(fp,0L,SEEK_SET);//文件指针定位到文件开头

    if (length > 1024*8)
    {
        ret = -1;
        printf("file > 8K not support\n");
        return ret;
    }
    while (!feof(fp))
    {
        //循环读取一行
        memset(linebuf,0,sizeof(linebuf));
        tmp = fgets(linebuf,MaxLine,fp);
        if (tmp ==NULL)
        {
            break;
        }
        //key关键字是否在本行
        tmp = strstr(linebuf,key);
        if (tmp == NULL)//不在本行
        {
            strcat(filebuf,linebuf);//追加本行到filebuf中
            continue;//继续下轮循环
        }
        else//在本行 将新的key = value copy到filebuf中
        {
            sprintf(linebuf,"%s = %s\n",key,valuebuf);//将新的key = value 覆盖掉旧的
            strcat(filebuf,linebuf);
            iTag = 1;//标志位 key在本行
        }
    }
    //key不在文件中,在文件末尾追加
    if (iTag == 0)
    {
        ret = fprintf(fp,"%s = %s\n",key,valuebuf);
        if (ret == -1)
        {
            printf("func sprintf() error\n");
            return ret;
        }    
        if (fp != NULL)
        {
            fclose(fp);
        }    
    }
    else//key存在文件中  创建新文件覆盖旧文件
    {
        if (fp!=NULL)
        {
            //关闭原来的文件
            fclose(fp);
        }
        fp = fopen(filename,"w+t");
        if (fp == NULL)
        {
            ret = -1;
            printf("func fopen() err \n");
            return ret;
        }
        ret = fputs(filebuf,fp);
        if ( ret < 0 )
        {
            printf("func fputs err \n");
            return ret;
        }
        if (fp!=NULL)
        {
            fclose(fp);
        }
    }
    return 0;
}
//去除字符串前后的空格
int trimSpace(char*inStr,char*out)  
{  
    char *p = inStr;  
    int ret = 0;  
    int i;  
    if (p==NULL)  
    {  
        ret = -1;  
        return;  
    }  
    for (i=0;p[i]!='\0';i++)  
    {  
        if (p[i]!=' ')  
        {  
            *out++ = p[i];  
        }  
    }  
    *out='\0';  

    return ret;  
}  
test.c

#include 
#include 
#include 
#include "cfg_op.h"

#define CFGNAME "e:/mycfg.ini"

void memu()
{
    printf("======================\n");
    printf("1.测试写配置文件\n");
    printf("2.测试读配置文件\n");
    printf("0.退出配置文件\n");
    printf("======================\n");
}
int TwriteCfg()
{
    char key[1024] = {0};
    char valuebuf[1024] = {0};
    int ret = 0;
    //从键盘获取输入
    printf("\n请键入key:");
    scanf("%s",key);
    printf("\n请键入value:");
    scanf("%s",valuebuf);
    printf("您的输入是:%s = %s\n",key,valuebuf);

    ret = writeCfg(CFGNAME,key,valuebuf);
    if (ret!=0)
    {
        printf("func writeCfg err:%d\n",ret);
        return ret;
    }
    return ret;
}
int TreadCfg()
{
    char key[1024] = {0};
    char valuebuf[1024] = {0};
    int ret = 0;
    //从键盘获取输入
    printf("\n请键入key:");
    scanf("%s",key);
    
    ret = readCfg(CFGNAME,key,valuebuf);

    if (ret!=0)
    {
        printf("func readCfg err:%d\n",ret);
        return ret;
    }
    printf("value:%s\n",valuebuf);
    return ret;
}
int main()
{
    int choice;

    for (;;)
    {
        memu();
        scanf("%d",&choice);
        switch(choice)
        {
        case 1://写配置项
            TwriteCfg();
            break;
        case 2://读配置项
            TreadCfg();
            break;
        case 0:
            exit(0);
            break;
        default:
            exit(0);
        }
    }
    system("pause");
    return 0;
}
图形界面

配置文件读写案例_第1张图片



你可能感兴趣的:(C语言提高)