配置文件读写(c语言指针实现)

来源:互联网 发布:程序员第一天上班干嘛 编辑:程序博客网 时间:2024/05/17 02:13
// cfg_op.h#ifndef _INC_CFG_OP_H#define _INC_CFG_OP_H#ifdef  __cplusplusextern "C" {#endifint 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*/);//int CfgItem_Init(void *pHandle, int iType);//int GetCfgItem(void *pHandle /*in*/, char *pKey /*in*/, char * pValue/*in out*/, int * pValueLen /*out*/);//int WriteCfgItem(void *pFileName /*in*/, char *pItemName /*in*/, char *pItemValue/*in*/, int itemValueLen /*in*/);//int CfgItem_Destory(void *pHandle);#ifdef  __cplusplus}#endif#endif 

#include "stdio.h"#include "stdlib.h"#include "string.h"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*/);//实现流程//打开文件//按照行的方式 循环读文件//解析每一行,若匹配key关键字,在进行value值的提取//提取value值需要 1去除前后空格 1级指针典型应用#define  LineMaxLen 2048#define  KeyMaxLen 64int GetCfgItem(char *pFileName /*in*/, char *pKey /*in*/, char * pValue/*in out*/, int * pValueLen /*out*/){intrv = 0;FILE*fp = NULL;charlineBuf[LineMaxLen];char*pTmp = NULL, *pBegin = NULL, *pEnd = NULL;if (pFileName==NULL || pKey==NULL || pValue==NULL || pValueLen==NULL) {rv = -1;printf("GetCfgItem() err. param err \n");goto End;}fp = fopen(pFileName, "r");if (fp == NULL){rv = -2;printf("fopen() err. \n");goto End;}while (!feof(fp)){//读每一行memset(lineBuf, 0, sizeof(lineBuf));pTmp = fgets(lineBuf, LineMaxLen, fp);if (pTmp == NULL) {break;}//不含=, 非配置项pTmp = strchr(lineBuf, '=');if (pTmp == NULL){continue;}//key是否在本行pTmp = strstr(lineBuf, pKey);if (pTmp == NULL){continue;}//调整到=右边,取value准备pTmp = strchr(lineBuf, '=');if (pTmp == NULL){continue;}pTmp = pTmp + 1;//获取value 起点while (1) {if (*pTmp == ' '){pTmp ++ ;} else{pBegin = pTmp;if (*pBegin == '\n'){//没有配置valueprintf("配置项:%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);break;}End:if (fp != NULL){fclose(fp); }return rv;}//实现流程//循环读每一行,检查key配置项是否存在 若存在修改对应value值//若不存在,在文件末尾 添加 "key = value"//难点:如何修改文件流中的值int SetCfgItem(char *pFileName /*in*/, char *pKey /*in*/, char * pValue/*in*/, int ValueLen /*in*/){intrv = 0, iTag = 0, length = 0;FILE*fp = NULL;charlineBuf[LineMaxLen];char*pTmp = NULL, *pBegin = NULL, *pEnd = NULL;charfilebuf[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); //获取文件长度;length = ftell(fp);fseek(fp, 0L, SEEK_SET);if (length > 1024*8) {rv = -3;printf("文件超过1024*8, nunsupport");goto End;}while (!feof(fp)){//读每一行memset(lineBuf, 0, sizeof(lineBuf));pTmp = fgets(lineBuf, LineMaxLen, fp);if (pTmp == NULL) {break;}//key关键字是否在本行pTmp = strstr(lineBuf, pKey);if (pTmp == NULL){strcat(filebuf, lineBuf);continue;}else{sprintf(lineBuf, "%s = %s\n", pKey, pValue);strcat(filebuf, lineBuf);//若存在keyiTag = 1; }}//若不存在 追加if (iTag == 0) {fprintf(fp, "%s = %s\n", pKey, pValue);}else //若存在{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);//fwrite(filebuf, sizeof(char), strlen(filebuf), fp);}End:if (fp != NULL){fclose(fp); }return rv;}

0 0