C语言 文件操作10--配置文件读写
//配置文件读写项目 #define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h> int writefile(const char *path/*in*/, char *pkey/*in*/, char *pvalue/*in*/){
int ERRO_MSG = ;
if (path == NULL)
{
ERRO_MSG = ;
printf("path==NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
if (pkey == NULL)
{
ERRO_MSG = ;
printf("pkey==NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
if (pvalue == NULL)
{
ERRO_MSG = ;
printf("pvalue==NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
} //定义文件读指针
FILE *fpwr = fopen(path, "r+");
//判断文件是否打开成功
if (fpwr == NULL)
{
ERRO_MSG = ;
printf("文件打开失败!erro msg:%d;文件路径是%s\n", ERRO_MSG, path);
return ERRO_MSG;
}
//判断原来配置文件里是否有该节点,有该配置节点执行修改操作,没有执行新增操作
//准备字符指针数组,存储所有的键值对
//定义下标
int index = ;
char **bufarr = (char **)malloc(sizeof(char *)*(index + ));
//存储所有的配置文件(这里读取键值对,用fgets()函数比较合适,因为一行正好一个键值对)
while (!feof(fpwr)){//feof()如果文件结束,则返回非0值,否则返回0
//定义文件缓存数组
char buf[] = { };
//读取文件
fgets(buf, , fpwr);
//分配每个键值对内存存储空间
char *ptemp = (char *)malloc(sizeof(char)*((int)strlen(buf) + ));
//拷贝字符串(buf定义在栈里,出了该函数会自动释放)
strcpy(ptemp, buf);//strcpy()把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间。
//把字符串挂到指针数组上
bufarr[index++] = ptemp;
//为指针数组再次分配内存空间
bufarr = (char **)realloc(bufarr, sizeof(char *)*(index + ));
}
//为指针数组最后一个元素赋值NULL
bufarr[index] = NULL;
//开始查找对应键值对
int a = ;
char *strindex = NULL;
while (bufarr[a] != NULL){
char *ptsource = bufarr[a];
while (*ptsource != '\0'){
int b = , flag = ;
//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 = ;
break;
}
//开始匹配字符串
while (pkey[b] != '\0'){
//一个一个字符进行比较
if (*(ptempc++) != pkey[b++])
{
flag = ;
strindex = NULL;
break;
}
}
break;
}
if (strindex != NULL)
{
//执行修改操作
//释放原来的字符串
if (bufarr[a] != NULL)
{
free(bufarr[a]);
char newbuf[] = { };
sprintf(newbuf, "%s=%s\r\n", pkey, pvalue);
//开辟新的字符串内存空间
char *pnewstr = (char *)malloc(sizeof(char)*((int)strlen(newbuf) + ));
//复制字符串
strcpy(pnewstr, newbuf);
bufarr[a] = pnewstr;
}
break;
}
a++;
}
//没有找到对应的键
if (strindex == NULL)
{
//执行新增操作
bufarr = (char **)realloc(bufarr, sizeof(char *)*(index + ));
char newbuf[] = { };
sprintf(newbuf, "%s=%s\r\n", pkey, pvalue);
//开辟新的字符串内存空间
char *pnewstr = (char *)malloc(sizeof(char)*((int)strlen(newbuf) + ));
//拷贝字符串
strcpy(pnewstr, newbuf);
bufarr[index] = pnewstr;
bufarr[index + ] = NULL;
}
int index2 = ;
//关闭文件指针
if (fpwr != NULL)
{
fclose(fpwr);
}
//为什么这里我会重新打开文件呢
//因为fopen()操作了文件指针fpwr,现在文件指针指向了文件末尾,(文件指针不同文件内部的位置指针,即fpwr(文件指针),(文件位置指针)fpwr->_ptr)
//如果不关闭文件指针fpwr,那么写文件就会从文件末尾开始写,导致数据的追加
//但是也有别的办法
//就是使用rewind(fpwr)方法
//函数名: rewind()
//功 能 : 将文件内部的位置指针重新指向一个流(数据流 / 文件)的开头
//注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。 //打开新文件指针
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 = ;
if (path == NULL)
{
ERRO_MSG = ;
printf("path!=NULL erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
//定义文件指针
FILE *fpr = NULL;
//打开文件
fpr = fopen(path, "r");
if (fpr == NULL)
{
ERRO_MSG = ;
printf("文件打开失败 erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
while (!feof(fpr)){
char buf[] = { };
fgets(buf, , fpr);
printf("%s", buf);
}
//关闭文件指针
if (fpr != NULL)
{
fclose(fpr);
}
return ERRO_MSG;
} void testf1(const char *path/*in*/){
char buf1[] = { };
char buf2[] = { };
printf("请输入键:\n");
scanf("%s", buf1);
printf("请输入值:\n");
scanf("%s", buf2);
writefile(path, buf1, buf2);
} void main(){
char *path = "E:/Test/CwordTest/b1.txt";
while (){
int num = ;
printf("请输入对应的操作:\n");
printf("添加新的键值对请按1:\n");
printf("查询所有键值对请按2:\n");
printf("修改键值对请按3:\n");
scanf("%d", &num);
switch (num)
{
case :
testf1(path);
break;
case :
readfile(path);
break;
case :
testf1(path);
break;
default:
break;
}
}
system("pause");
}
C语言 文件操作10--配置文件读写的更多相关文章
- go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )
go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...
- C 语言文件操作
C 语言文件操作 1. 数据流: 程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流. 所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...
- C语言文件操作函数
C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...
- 【转】C语言文件操作解析(三)
原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...
- C语言文件操作函数大全(超详细)
C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fc ...
- C语言文件操作 FILE结构体
内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...
- C语言文件操作
C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...
- C语言文件操作解析(五)之EOF解析(转载)
C语言文件操作解析(五)之EOF解析 在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符.但是很多时候对这个理解并不是很清楚,导致在写代码的时候经常出错,特 ...
- C语言文件操作详解
C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现.文件操作标准库函数有: 文件的打开操作 fopen 打开一个文件 文件的关闭操作 fclose 关闭一个文件 ...
随机推荐
- android res文件夹下面的 values-v11 、 values-v14
values-v11代表在API 11+的设备上,用该目录下的styles.xml代替res/values/styles.xml values-v14代表在API 14+的设备上,用该目录下的styl ...
- HBase权威指南环境配置
出处:http://wuyudong.com/1958.html 系统采用ubuntu-14.04,64bit 1.安装git sudo apt-get install git 出现下面错误:Err ...
- UIStoryBoard 中修改控件borderColor
storyBoard中直接修改UI控件的边框颜色,可以避免先关联再从控制器中修改属性等繁琐操作 因为layer.borderColor隶属于CALayer对象,且CGColor无法直接在sb中直接使用 ...
- Quartz2D学习笔记
1.drawRect方法 //1.证明drawRect方法是在viewDidLoad后自动调用的,方便处理View的相关属性 // YQView * view = [[YQView alloc] in ...
- android 短信助手demo
关于意图Intent: 显式意图:必须指定要激活的组件的完整包名和类名(应用程序之间耦合在一起) 一般激活自己应用的组件的时候采用显式意图 隐式意图:只需要指定动作和数据就可以(好处是应用程序之间没有 ...
- IPv4中IP地址分类
分三个部分进行讲述: 1 五类IP 2 特殊用途的IP 3 私有IP 1 五类IP IPV4简单粗暴地把IP地址分为五类.分类方法如下图所示: 也就是说,分为以下几类: A: 0.0.0.0-127. ...
- maven问题-"resolution will not be reattempted until the update interval of MyRepo has elapsed"
最近在家里写maven程序的时候老是出现问题,有些问题到了公司就突然消失了. 在修改pom文件后保存的反应还是比较明显的,家里的网遇到有些依赖根本下载不了..墙. 但是到了公司,不但速度快,几乎啥都能 ...
- Effective Java 33 Use EnumMap instead of ordinal indexing
Wrong practice: Putting sets into an array indexed by the type's ordinal /** * Added demo for the &q ...
- Java中关于 BigDecimal 的一个导致double精度损失的"bug"
背景 在博客 恶心的0.5四舍五入问题 一文中看到一个关于 0.5 不能正确的四舍五入的问题.主要说的是 double 转换到 BigDecimal 后,进行四舍五入得不到正确的结果: public ...
- GDI学习之俄罗斯方块续
当前方块对象 #region 定义砖块int[i,j,y,x] Tricks:i为那块砖,j为状态,y为列,x为行 private int[, , ,] Tricks = {{ { {,,,}, {, ...