c配置文件读取写入
头文件:Cfg.h
#ifndef CFG_SET_GET_H #define CFG_SET_GET_H #ifdef __cplusplus extern "C" { #endif int setCfg(char * filename, char *key, char *value); int getCfg(char * filename, char *key, char *value); #ifdef __cplusplus } #endif #endif // !CFG_SET_GET_H
实现文件:Cfg.c
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #define MaxLineSize 2048 #define MaxKeySize 64 int setCfg(char * filename, char *key, char *value) { //返回值 文件总长度 int rv = 0, length = 0,isSet = 0; //文件指针 FILE * fp = NULL; //暂时保存每行值 char stringBuf[MaxLineSize]; char *p; //缓存文字 char logBuffer[2048 * 8] = { 0 }; //缓存当前行的key char cachekey[MaxKeySize]; //临时辅助指针 char * vbegin = NULL, *vend = NULL, *vtemp = NULL; memset(cachekey, 0, MaxKeySize); if (filename == NULL || key == NULL || value == NULL) { printf("PARAM IS ERROR..."); rv = 1; goto End; } fp = fopen(filename, "r+"); if (fp == NULL) { printf("FILE OPEN ERROR..."); rv = 2; goto End; } //移动到最后 fseek(fp, 0L, SEEK_END); //获取总长度 length = ftell(fp); if (length > 2048*8) { printf("FILE IS TOO BIG TO OPERATE..."); rv = 3; goto End; } //移动到最开始 fseek(fp, 0L,SEEK_SET); while (!feof(fp)) { //初始化值 memset(stringBuf, 0, 2048); //获取一行 p = fgets(stringBuf, 2048, fp); //没有匹配到字符 则继续 if (p == NULL) { break; } //保存=字符的指针 vtemp = strchr(stringBuf, '='); //没有匹配到=字符 则继续 if (vtemp == NULL) { continue; } //没有匹配到key字符 则继续 vtemp = p; //去除key前的空字符 while (1) { //直到不为空 if (*vtemp == ' ') { vtemp++; continue; } if (*vtemp == '=') { printf("KEY IS EMPTY...\n"); rv = 4; goto End; } vbegin = vtemp; break; } //去除key后的空字符 while (1) { if (*vtemp != ' ' && *vtemp != '=') { vtemp++; continue; } vend = vtemp; break; } memcpy(cachekey, vbegin, vend - vbegin); *(cachekey + (vend - vbegin)) = '\0'; //没有找到KEY的话 直接链接缓存 继续下一行 if (strcmp(cachekey, key) != 0) { //连接字符串 strcat(logBuffer, stringBuf); continue; } //找到配置项之后 重新配置 连接字符串 sprintf(stringBuf, "%s = %s\n", key, value); strcat(logBuffer, stringBuf); isSet = 1; } if (isSet == 0) { fprintf(fp, "%s = %s\n", key, value); } else { if (fp != NULL) { fclose(fp); fp = NULL; } fp = fopen(filename, "w+"); if (fp == NULL) { printf("FILE OPEN ERROR 2...\n"); rv = 5; goto End; } fputs(logBuffer, fp); } End: if (fp != NULL) { fclose(fp); fp = NULL; } return rv; } int getCfg(char * filename, char *key,char *value) { //返回值 int rv = 0; //每行的指针 char *p = NULL; //暂时保存每行值 char stringBuf[MaxLineSize]; //文件指针 FILE *fp = NULL; //缓存当前行的key char cachekey[MaxKeySize]; //临时辅助指针 char * vbegin = NULL, *vend = NULL, *vtemp = NULL; memset(cachekey, 0, MaxKeySize); if (filename == NULL || key == NULL || value == NULL) { printf("PARAM IS ERROR...\n"); rv = 1; goto End; } fp = fopen(filename, "r"); if (fp == NULL) { printf("FILE OPEN ERROR...\n"); rv = 2; goto End; } while (!feof(fp)) { //初始化值 memset(stringBuf, 0, 2048); //获取一行 p = fgets(stringBuf, 2048, fp); //没有匹配到字符 则继续 if (p == NULL) { break; } //*开头的要忽略 /*if (*p == '#') { continue; }*/ //保存=字符的指针 vtemp = strchr(stringBuf, '='); //没有匹配到=字符 则继续 if (vtemp == NULL) { continue; } //没有匹配到key字符 则继续 vtemp = p; //去除key前的空字符 while (1) { //直到不为空 if (*vtemp == ' ') { vtemp++; continue; } if (*vtemp == '=') { printf("KEY IS EMPTY...\n"); rv = 4; goto End; } vbegin = vtemp; break; } //去除key后的空字符 while (1) { if (*vtemp != ' ' && *vtemp != '=') { vtemp++; continue; } vend = vtemp; break; } memcpy(cachekey, vbegin, vend - vbegin); *(cachekey + (vend - vbegin)) = '\0'; if (strcmp(cachekey, key) != 0) { continue; } //上面代码优化了下面注释的代码 /*if (strstr(p, key) == NULL) { continue; }*/ vbegin = NULL; vend = NULL; vtemp = strchr(stringBuf, '='); //向右一个字符 vtemp++; //获取头指针 while (1) { //消除空格 if (*vtemp == ' ') { vtemp++; continue; } //保存值的首指针 if (*vtemp == '\n') { printf("VALUE IS EMPTY...\n"); rv = 3; goto End; } //保存头指针 vbegin = vtemp; break; } //获取尾指针 while (1) { if (*vtemp == ' ' || *vtemp == '\n') { break; } vtemp++; } vend = vtemp; memcpy(value, vbegin, vend - vbegin); *(value + (vend - vbegin)) = '\0'; break; } if (*value == '\0') { printf("CONFIG UNFINDED...\n"); rv = 5; } End: //释放内存空间 if (fp != NULL) { fclose(fp); fp = NULL;//避免野指针 } return rv;//返回错误值 }
测试文件:file.c
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include "Cfg.h" #define CFG_FILE_NAME "C:/config.ini" #define MaxLineSize 2048 #define MaxKeySize 64 void MenuList() { printf("PRESS 1 TO SETCONFIG.\n"); printf("PRESS 2 TO GETCONFIG.\n"); printf("PRESS 0 TO EXIT.\n"); printf("SELECT A CONFIG MODE:"); } void setCongfigTest() { int rv = 0; char key[MaxKeySize]; char value[MaxLineSize]; memset(key, 0, MaxKeySize); memset(value, 0, MaxLineSize); printf("ENTER A KEY:"); scanf("%s", key); printf("ENTER A VALUE:"); scanf("%s", value); rv = setCfg(CFG_FILE_NAME, key, value); if (rv == 0) { printf("SETCONFIG SUCCESS...\n"); } printf("------------------------------------\n"); } void getCongfigTest() { int rv = 0; char key[MaxLineSize]; char value[MaxLineSize]; memset(key, 0, MaxLineSize); memset(value, 0, MaxLineSize); printf("ENTER A KEY TO GET VALUE:"); scanf("%s", key); rv = getCfg(CFG_FILE_NAME, key, value); if (rv == 0) { printf("VALUE OF KEY IS:%s\n", value); } printf("------------------------------------\n"); } void main() { int a = 4; while (a != 0) { MenuList(); scanf("%d", &a); if (a != 0 && a !=1 && a != 2) { printf("CMD ORDER IS NOT EXIST.\n"); printf("------------------------------------\n"); continue; } switch (a) { case 1: setCongfigTest(); break; case 2: getCongfigTest(); break; case 0: printf("LOGOUT SUCCESS.\n"); printf("------------------------------------\n"); break; } } system("pause"); }