码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 读取配置文件

时间:2015-08-29 00:44:20      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

#ifndef __CFG_OP_H__
#define __CFG_OP_H__


#ifdef  __cplusplus
extern "C" {
#endif

//获取配置项
int GetCfgItem(char *pFileName /*in*/, char *pKey /*in*/, char * pValue/*in out*/, int * pValueLen /*out*/);

//写配置项 
int WriteCfgItem(char *pFileName /*in*/, char *pItemName /*in*/, char *pItemValue/*in*/, int itemValueLen /*in*/);


#ifdef  __cplusplus
}
#endif



#endif
#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define MaxLine 2048 

//获取配置项
int GetCfgItem(char *pFileName /*in*/, char *pKey /*in*/, char * pValue/*in out*/, int * pValueLen /*out*/)
{

    int        ret = 0;
    FILE    *fp = NULL;
    char    *pTmp = NULL, *pEnd = NULL, *pBegin = NULL;

    char lineBuf[MaxLine];

    fp = fopen(pFileName, "r");//读的方式打开文件
    if (fp == NULL)
    {
        ret = -1;
        return ret;
    }

    while (!feof(fp))//没有到达文件末尾
    {
        memset(lineBuf, 0, sizeof(lineBuf));//清空内存空间
         //fgets(_Out_z_cap_(_MaxCount) char * _Buf, _In_ int _MaxCount, _Inout_ FILE * _File);
        fgets(lineBuf, MaxLine, fp);//从文件中一行一行的获取数据
        //printf("lineBuf:%s ",lineBuf );

        pTmp = strchr(lineBuf, =); //有没有等号
        if (pTmp == NULL) //没有=号
        {
            continue;
        }

        pTmp = strstr(lineBuf, pKey);//所在行 是不是有key
        if (pTmp == NULL) //判断key是不是在 
        {
            continue;
        }
        pTmp = pTmp + strlen(pKey); //mykey1 = myvalude11111111 ==> "= myvalude1111111"

        pTmp = strchr(pTmp, =);
        if (pTmp == NULL) //判断key是不是在 //所在行 是不是有key
        {
            continue;
        }
        pTmp = pTmp + 1;
        //
        //printf("pTmp:%s ", pTmp);

        //获取value 起点
        while (1) 
        {
            if (*pTmp ==  )
            {
                pTmp ++ ;
            } 
            else
            {
                pBegin = pTmp;
                if (*pBegin == \n)
                {
                    //没有配置value
                    //printf("配置项:%s 没有配置value \n", pKey);
                    goto End;
                }
                break;
            }
        }

        //获取valude结束点
        while (1) 
        {
            if ((*pTmp ==   || *pTmp == \n))
            {
                break;
            }
            else 
            {
                pTmp ++;
            }
        }
        pEnd = pTmp;

        //赋值
        *pValueLen = pEnd-pBegin;
        memcpy(pValue, pBegin, pEnd-pBegin);
    }

End:
    if (fp == NULL)
    {
        fclose(fp);
    }
    return 0;

}

//写配置项 
//实现流程
//循环读每一行,检查key配置项是否存在 若存在修改对应value值
//若不存在,在文件末尾 添加 "key = value"
//难点:如何修改文件流中的值
int WriteCfgItem(char *pFileName /*in*/, char *pKey /*in*/, char * pValue/*in*/, int ValueLen /*in*/)
{
    int        rv = 0, iTag = 0, length = 0;
    FILE    *fp = NULL;
    char    lineBuf[MaxLine];
    char    *pTmp = NULL, *pBegin = NULL, *pEnd = NULL;
    char    filebuf[1024*8] = {0};

    if (pFileName==NULL || pKey==NULL || pValue==NULL) 
    {
        rv = -1;
        printf("SetCfgItem() err. param err \n");
        goto End;
    }

    fp = fopen(pFileName, "r+");
    if (fp == NULL)
    {
        rv = -2;
        printf("fopen() err. \n");
        //goto End;
    }

    if (fp == NULL)//文件不存在就去创建一个文件
    {
        fp = fopen(pFileName, "w+t");
        if (fp == NULL)
        {
            rv = -3;
            printf("fopen() err. \n");
            goto End;
        }
    }

    fseek(fp, 0L, SEEK_END); //刚开始文件指针指向的是文件的开头,把文件指针从0位置开始,移动到文件末尾
    //获取文件长度;
    length = ftell(fp);//fp指向了文件的末尾

    fseek(fp, 0L, SEEK_SET);//再把文件指针指向文件的头部

    if (length > 1024*8) //文件不能超过8K,不然内存不支持
    {
        rv = -3;
        printf("文件超过1024*8, nunsupport");
        goto End;
    }

    while (!feof(fp))
    {
        //读每一行
        memset(lineBuf, 0, sizeof(lineBuf));
        pTmp = fgets(lineBuf, MaxLine, fp);
        if (pTmp == NULL) 
        {
            break;
        }

        //key关键字是否在本行
        pTmp = strstr(lineBuf, pKey);
        if (pTmp == NULL) //key关键字不在本行, copy到filebuf中
        {
            strcat(filebuf, lineBuf);//复制到filebuf中去
            continue;
        }
        else  //key关键在在本行中,替换旧的行,再copy到filebuf中 
        {
            sprintf(lineBuf, "%s = %s\n", pKey, pValue);  
            strcat(filebuf, lineBuf);
            //若存在key
            iTag = 1; 
        }
    }

    //所有的行中若key关键字,不存在 追加
    if (iTag == 0) 
    {
        fprintf(fp, "%s = %s\n", pKey, pValue);//格式化输入
    }
    else //若key关键字,存在,则重新创建文件
    {
        if (fp != NULL) 
        { 
            fclose(fp); //关闭文件
            fp = NULL; //避免野指针
        }

        fp = fopen(pFileName, "w+t"); //重新建立一个文件
        if (fp == NULL)
        {
            rv = -4;
            printf("fopen() err. \n");
            goto End;
        }
        fputs(filebuf, fp);//把所有文件缓冲的内容输入到fp,覆盖原来的文件
        //fwrite(filebuf, sizeof(char), strlen(filebuf), fp);
    }

End:
    if (fp != NULL)
    {
        fclose(fp); 
    }
    return rv;
}
#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "cfg_op.h"

#define CFGNAME "c:/mycfg.ini"
void mymenu()
{
    printf("=============================\n");
    printf("1 测试写配置文件\n");
    printf("2 测试读配置文件\n");
    printf("0 退出\n");
    printf("=============================\n");
}

//获取配置项
int TGetCfg()
{
    int        ret = 0;
    //读配置项 
    char    name[1024] = {0};
    char    valude[1024] = {0};
    int        vlen = 0;

    printf("\n请键入key:");
    scanf("%s", name);

    ret = GetCfgItem(CFGNAME /*in*/, name /*in*/, valude/*in*/, &vlen);
    if (ret != 0)
    {
        printf("func WriteCfgItem err:%d \n", ret);
        return ret;
    }
    printf("valude:%s \n", valude);

}

//写配置项 
int TWriteCfg()
{
    int        ret = 0;
    //写配置项 
    char name[1024] = {0};
    char valude[1024] = {0};


    printf("\n请键入key:");
    scanf("%s", name);

    printf("\n请键入valude:");
    scanf("%s", valude);

    ret = WriteCfgItem(CFGNAME /*in*/, name /*in*/, valude/*in*/,strlen(valude) /*in*/);
    if (ret != 0)
    {
        printf("func WriteCfgItem err:%d \n", ret);
        return ret;
    }
    printf("你的输入是:%s = %s \n", name , valude);
    return ret;
}

void main()
{

    int choice;

    for (;;)
    {
        //显示一个菜单
        mymenu();
        scanf("%d", &choice);
        switch (choice)
        {
            
        case 1:   //写配置项
            TWriteCfg();
            break;
        case 2: 
            TGetCfg(); //读配置项
            break;
        case 0: 
            exit(0);
        default:;
            exit(0);
        }

    }
    printf("hello...\n");
    system("pause");
    return ;
}

 

C++ 读取配置文件

标签:

原文地址:http://www.cnblogs.com/yaowen/p/4768128.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!