• C读取配置文件


    #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 == '
    ')
                    {
                        //没有配置value
                        //printf("配置项:%s 没有配置value 
    ", pKey);
                        goto End;
                    }
                    break;
                }
            }
    
            //获取valude结束点
            while (1) 
            {
                if ((*pTmp == ' ' || *pTmp == '
    '))
                {
                    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 
    ");
            goto End;
        }
    
        fp = fopen(pFileName, "r+");
        if (fp == NULL)
        {
            rv = -2;
            printf("fopen() err. 
    ");
            //goto End;
        }
    
        if (fp == NULL)//文件不存在就去创建一个文件
        {
            fp = fopen(pFileName, "w+t");
            if (fp == NULL)
            {
                rv = -3;
                printf("fopen() err. 
    ");
                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
    ", pKey, pValue);  
                strcat(filebuf, lineBuf);
                //若存在key
                iTag = 1; 
            }
        }
    
        //所有的行中若key关键字,不存在 追加
        if (iTag == 0) 
        {
            fprintf(fp, "%s = %s
    ", pKey, pValue);//格式化输入
        }
        else //若key关键字,存在,则重新创建文件
        {
            if (fp != NULL) 
            { 
                fclose(fp); //关闭文件
                fp = NULL; //避免野指针
            }
    
            fp = fopen(pFileName, "w+t"); //重新建立一个文件
            if (fp == NULL)
            {
                rv = -4;
                printf("fopen() err. 
    ");
                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("=============================
    ");
        printf("1 测试写配置文件
    ");
        printf("2 测试读配置文件
    ");
        printf("0 退出
    ");
        printf("=============================
    ");
    }
    
    //获取配置项
    int TGetCfg()
    {
        int        ret = 0;
        //读配置项 
        char    name[1024] = {0};
        char    valude[1024] = {0};
        int        vlen = 0;
    
        printf("
    请键入key:");
        scanf("%s", name);
    
        ret = GetCfgItem(CFGNAME /*in*/, name /*in*/, valude/*in*/, &vlen);
        if (ret != 0)
        {
            printf("func WriteCfgItem err:%d 
    ", ret);
            return ret;
        }
        printf("valude:%s 
    ", valude);
    
    }
    
    //写配置项 
    int TWriteCfg()
    {
        int        ret = 0;
        //写配置项 
        char name[1024] = {0};
        char valude[1024] = {0};
    
    
        printf("
    请键入key:");
        scanf("%s", name);
    
        printf("
    请键入valude:");
        scanf("%s", valude);
    
        ret = WriteCfgItem(CFGNAME /*in*/, name /*in*/, valude/*in*/,strlen(valude) /*in*/);
        if (ret != 0)
        {
            printf("func WriteCfgItem err:%d 
    ", ret);
            return ret;
        }
        printf("你的输入是:%s = %s 
    ", 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...
    ");
        system("pause");
        return ;
    }
  • 相关阅读:
    asking邱宝裕
    一文深度解读量化交易(下)
    一文深度解读量化交易(上)
    关于日内波段交易系统:一个期货高手的交易思路独白
    财务报表分析(张新民教授)-第一章笔记
    定增游戏(二)
    leetcode -- Restore IP Addresses
    leetcode -- Minimum Window Substring
    leetcode -- Maximal Rectangle TODO O(N)
    leetcode -- Unique Binary Search Trees II
  • 原文地址:https://www.cnblogs.com/yaowen/p/4768128.html
Copyright © 2020-2023  润新知