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 关闭一个文件 ...
随机推荐
- NSOperation创建队列
#pragma mark - NSOperation //NSOperation不能直接进行多线程的创建,需要帮助:NSOperationQueue // 使用NSOperation的第一个子类去创建 ...
- 使用greenDAO生成DAO代码
研究greenDAO有几天了,刚开始看别人的博客基本都把我带到了沟里,讲gradle把简单的问题搞得非常复杂,而且都是抄来抄去,看来看去也就那么几篇,实在看不下去了,只得硬着头皮自己琢磨,好在终于把这 ...
- iOS 学习 - 6.Objective-C中的各种遍历(迭代)方式
说明:转自文顶顶 一.使用 for 循环 要遍历字典.数组或者是集合,for 循环是最简单也用的比较多的方法 -(void)iteratorWithFor { //////////处理数组////// ...
- android 隐藏标题栏
在onCreate()方法中添加如下代码: public class FirstActivity extends Activity { @Override protected void onCreat ...
- iOS支付宝集成时遇到的问题整理(2)
1.集成支付宝SDK编译报错#include<openssl/asn1.h>这一行 “openssl/asn1.h”file not found 解决方法:在BuildSetting 里 ...
- 对石家庄铁道大学网站首页进行UI分析
对石家庄铁道大学网站首页进行UI界面分析首先,铁道大学的网页首页分为图文热点,学校新闻,校内公告,媒体看铁大,学术咨询等等模块.通过分析这些模块,可以看出,学校网站首页针对的使用对象有很多,包括学校领 ...
- Go对OO的选择
Go摒弃了许多OO的概念,但是还是很好的继承了OO的精髓——消息传递.我猜这个是学了Smalltalk的.通常我们说OO,我们会说这三大特性:对象,继承,多态. 1,Go中的对象 对于GO来说他的类型 ...
- Force.com平台基础
当我开始写这篇博客的时候,<Force.com Platform Fundamentals>的PDF版本我还没看到十分之一.由于PDF全部是英文的,所以我看起来比较吃力.我尝试过边看边做笔 ...
- mysql日志类型
在MySQL中共有4中日志:错误日志.二进制日志.查询日志和慢查询日志 一.错误日志 错误日志名 host_name.err,并默认在参数DATADIR指定的目录中写入日志文件.可使用 --log-e ...
- Neo4j 高可用集群安装
安装neo4j高可用集群,抓图安装过程 http://www.ibm.com/developerworks/cn/java/j-lo-neo4j/ Step1.下载neo4j商业版并解压,复制为neo ...