#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 ; }