cfg_op.h:
#pragma once
#define _CRT_NONSTDC_NO_WARNINGS //防止使用C语言函数报出不安全的错误
#ifndef _CFG_OP_H_
#define _CFG_OP_H_
#ifdef __cplusplus
extern "C"
int cfgWrite(char * fileName,char* key,char* value);
int cfgRead(char* fileName, char* key, char* value);
#endif
#endif // !CFG_OP_H
cfg_op.cpp
#include"cfg_op.h"
#include<iostream>
using namespace std;
#define maxline 2048
int cfgWrite(char * fileName, char* key, char* value) { //先把文件内容全部读入内存中,在进行数据写入
FILE *f;
int ret = 0, flag = 0;
char buf[maxline];
char filebuf[1024 * 8] = { 0 };
char* ptem = NULL;
char* pbegin = NULL, *pend = NULL;
if (fileName == NULL || key == NULL || value == NULL) {
ret = -2;
goto End;
}
f = fopen(fileName, "r+");
if (f == NULL) {
ret = -1;
cout << "打开文件失败!" << endl;
}
if (f == NULL) {
f = fopen(fileName, "w+t");
if (f == NULL) {
ret = -3;
cout << "创建文件失败!" << endl;
goto End;
}
}
fseek(f, 0L, SEEK_END); //从文件开头跳至文件末尾
int filelength = ftell(f); //求文件长度
fseek(f, 0L, SEEK_SET); //跳至文件头部
if (filelength > 1024 * 8) {
cout << "文件内容长度超过8k,不支持!" << endl;
goto End;
}
while (!feof(f))
{
memset(buf, 0, sizeof(buf));
ptem = fgets(buf, maxline, f);
if (ptem == NULL) break;
ptem = strstr(buf, key);
if (ptem == NULL) // 判断是否有key
{
strcat(filebuf, buf);
continue;
}
else {
sprintf(buf, "%s = %s\n", key, value); //替换读取的一行数据
strcat(filebuf, buf);
flag = 1; //判断是否是修改,还是直接写入新数据
}
}
if (flag == 0) {
fprintf(f, "%s = %s\n", key, value);
}
else
{
//修改 ,直接覆盖原文件,将filebuf中的数据写入新文件中,完成修改操作
if (f != NULL) {
fclose(f);
f = NULL;//避免野指针
}
f = fopen(fileName, "w+t");
if (f == NULL) {
ret = -4;
cout << "打开文件失败" << endl;
}
fputs(filebuf, f);
}
End:
if (f != NULL) {
fclose(f);
}
return ret;
}
int cfgRead(char* fileName, char* key, char* value) {
FILE *f;
int ret = 0;
char buf[maxline];
char* ptem = NULL;
char* pbegin,*pend;
f = fopen(fileName, "r");
if (f == NULL) {
ret = -1;
return ret;
}
while (!feof(f)) {
memset(buf, 0, sizeof(buf));
fgets(buf, maxline, f);
ptem = strchr(buf, '=');
if (ptem == NULL) continue; //判断是否有等号
ptem = strstr(buf, key);
if (ptem == NULL) continue; // 判断是否有key
ptem += strlen(key);
ptem = strchr(ptem, '=');
if (ptem == NULL) continue;
ptem++;
//获取开始点
while (1) {
if (*ptem == ' ') ptem++;
else {
if (*ptem == '\n')
{
ret = -2;
goto End;
}
else {
pbegin = ptem;
break;
}
}
}
//获取结束点
while (1) {
if (*ptem == '\0' || *ptem == '\n') {
break;
}
ptem++;
}
pend = ptem;
memcpy(value, pbegin, pend - pbegin);
break;
}
End:
if (f != NULL) {
fclose(f);
}
return ret;
}
#include<iostream>
#include"cfg_op.h"
using namespace std;
#define MyCfG "C:/1.ini"
void print() {
cout << "===================" << endl;
cout << "1.读配置文件 " << endl;
cout << "2.写配置文件 " << endl;
cout << "0.退出 " << endl;
cout << "===================" << endl;
}
int testWritecfg() {
//写配置文件
char key[1024] = { 0 };
char value[1024] = { 0 };
cout << "请输入key:";
cin >> key;
cout << "请输入value:";
cin >> value;
int ret=cfgWrite (MyCfG,key,value);
if (ret != 0) {
cout << "写配置文件错误!错误码为:" << ret << endl;
return ret;
}
return 0;
}
int testReadcfg() {
//读配置文件
char key[1024] = { 0 };
char value[1024] = { 0 };
int len = 0;
cout << "请输入key:";
cin >> key;
int ret = cfgRead(MyCfG, key, value);
if (ret != 0) {
cout << "读配置文件错误!错误码为:" << ret << endl;
return ret;
}
cout<<"value值为:"<< value << endl;
return 0;
}
void main() {
int choose;
for (;;) {
print();
cin >> choose;
switch (choose) {
case 1:testReadcfg(); break;
case 2:testWritecfg(); break;
case 0:exit(0);break;
default:cout << "输入错误!" << endl;
}
}
}
这个读写ini文件程序有一个小bug,是由于strstr()函数导致的,只要输入的是已输入key的子串,那么不会创建新的key而是直接操作主串。