小标
2018-12-03
来源 :
阅读 2404
评论 0
摘要:本文主要向大家介绍了C/C++知识点之C语言 配置文件读写,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
本文主要向大家介绍了C/C++知识点之C语言 配置文件读写,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
//配置文件读写项目
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
int writefile(const char *path/*in*/, char *pkey/*in*/, char *pvalue/*in*/){
int ERRO_MSG = 0;
if (path==NULL)
{
ERRO_MSG = 1;
printf("path==NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
if (pkey == NULL)
{
ERRO_MSG = 2;
printf("pkey==NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
if (pvalue == NULL)
{
ERRO_MSG = 3;
printf("pvalue==NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
//定义文件读指针
FILE *fpwr = fopen(path,"r+");
//判断文件是否打开成功
if (fpwr==NULL)
{
ERRO_MSG = 4;
printf("文件打开失败!erro msg:%d;文件路径是%s\n", ERRO_MSG,path);
return ERRO_MSG;
}
//判断原来配置文件里是否有该节点,有该配置节点执行修改操作,没有执行新增操作
//准备字符指针数组,存储所有的键值对
//定义下标
int index = 0;
char **bufarr = (char **)malloc(sizeof(char *)*(index + 1));
//存储所有的配置文件(这里读取键值对,用fgets()函数比较合适,因为一行正好一个键值对)
while (!feof(fpwr)){//feof()如果文件结束,则返回非0值,否则返回0
//定义文件缓存数组
char buf[100] = { 0 };
//读取文件
fgets(buf, 100, fpwr);
//分配每个键值对内存存储空间
char *ptemp = (char *)malloc(sizeof(char)*((int)strlen(buf)+1));
//拷贝字符串(buf定义在栈里,出了该函数会自动释放)
strcpy(ptemp, buf);//strcpy()把从src地址开始且含有‘\0‘结束符的字符串复制到以dest开始的地址空间。
//把字符串挂到指针数组上
bufarr[index++] = ptemp;
//为指针数组再次分配内存空间
bufarr = (char **)realloc(bufarr, sizeof(char *)*(index + 1));
}
//为指针数组最后一个元素赋值NULL
bufarr[index] = NULL;
//开始查找对应键值对
int a = 0;
char *strindex = NULL;
while (bufarr[a]!=NULL){
char *ptsource = bufarr[a];
while (*ptsource != ‘\0‘){
int b = 0, flag = 0;
//strchr函数原型:extern char *strchr(const char *s, char c); 返回首次出现c的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果s中不存在c则返回NULL。
char *ptempc = strchr(ptsource, pkey[b]);
ptsource = strindex=ptempc;
if (ptempc == NULL)
{
//没有找到该字符串
flag = 1;
break;
}
//开始匹配字符串
while (pkey[b] != ‘\0‘){
//一个一个字符进行比较
if (*(ptempc++) != pkey[b++])
{
flag = 1;
strindex = NULL;
break;
}
}
break;
}
if (strindex!=NULL)
{
//执行修改操作
//释放原来的字符串
if (bufarr[a]!=NULL)
{
free(bufarr[a]);
char newbuf[100] = { 0 };
sprintf(newbuf, "%s=%s\r\n", pkey, pvalue);
//开辟新的字符串内存空间
char *pnewstr = (char *)malloc(sizeof(char)*((int)strlen(newbuf)+1));
//复制字符串
strcpy(pnewstr, newbuf);
bufarr[a] = pnewstr;
}
break;
}
a++;
}
//没有找到对应的键
if (strindex==NULL)
{
//执行新增操作
bufarr = (char **)realloc(bufarr, sizeof(char *)*(index + 2));
char newbuf[100] = { 0 };
sprintf(newbuf, "%s=%s\r\n", pkey, pvalue);
//开辟新的字符串内存空间
char *pnewstr = (char *)malloc(sizeof(char)*((int)strlen(newbuf) + 1));
//拷贝字符串
strcpy(pnewstr, newbuf);
bufarr[index] = pnewstr;
bufarr[index + 1] = NULL;
}
int index2 = 0;
//关闭文件指针
if (fpwr != NULL)
{
fclose(fpwr);
}
//为什么这里我会重新打开文件呢
//因为写文件的时候是把缓存区的内容写入到文本里,此刻如果不是释放指针fpwr,缓存区里就会有刚刚读的内容
//所以必须释放指针才可以清空缓存
//打开新文件指针
FILE *pfw = fopen(path,"w");
//fflush(fpwr);
//开始写文件
while (bufarr[index2] != NULL){
//将文件写入到缓存
fputs(bufarr[index2], pfw);
//释放字符指针数组元素内存
free(bufarr[index2]);
index2++;
}
//释放字符指针数组内存
free(bufarr);
//关闭文件指针
if (pfw != NULL)
{
fclose(pfw);
}
return ERRO_MSG;
}
int readfile(const char *path/*in*/){
int ERRO_MSG = 0;
if (path==NULL)
{
ERRO_MSG = 1;
printf("path!=NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
//定义文件指针
FILE *fpr = NULL;
//打开文件
fpr = fopen(path,"r");
if (fpr==NULL)
{
ERRO_MSG = 2;
printf("文件打开失败 erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
while (!feof(fpr)){
char buf[100] = { 0 };
fgets(buf, 100, fpr);
printf("%s",buf);
}
//关闭文件指针
if (fpr!=NULL)
{
fclose(fpr);
}
return ERRO_MSG;
}
void testf1(const char *path/*in*/){
char buf1[100] = { 0 };
char buf2[100] = { 0 };
printf("请输入键:\n");
scanf("%s", buf1);
printf("请输入值:\n");
scanf("%s", buf2);
writefile(path, buf1, buf2);
}
void main(){
char *path = "E:/Test/CwordTest/b1.txt";
while (1){
int num = 0;
printf("请输入对应的操作:\n");
printf("添加新的键值对请按1:\n");
printf("查询所有键值对请按2:\n");
printf("修改键值对请按3:\n");
scanf("%d",&num);
switch (num)
{
case 1:
testf1(path);
break;
case 2:
readfile(path);
break;
case 3:
testf1(path);
break;
default:
break;
}
}
system("pause");
}
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!
喜欢 | 1
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号