//配置文件读写项目

#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--配置文件读写的更多相关文章

  1. go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

    go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...

  2. C 语言文件操作

    C 语言文件操作 1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...

  3. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

  4. 【转】C语言文件操作解析(三)

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  5. C语言文件操作函数大全(超详细)

    C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下   fopen(打开文件)相关函数 open,fc ...

  6. C语言文件操作 FILE结构体

    内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...

  7. C语言文件操作

    C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...

  8. C语言文件操作解析(五)之EOF解析(转载)

      C语言文件操作解析(五)之EOF解析 在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符.但是很多时候对这个理解并不是很清楚,导致在写代码的时候经常出错,特 ...

  9. C语言文件操作详解

    C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现.文件操作标准库函数有: 文件的打开操作 fopen 打开一个文件 文件的关闭操作 fclose 关闭一个文件 ...

随机推荐

  1. Android 在内部存储读写文件

    文件读写操作* Ram内存:运行内存,相当于电脑的内存* Rom内存:内部存储空间,相当于电脑的硬盘* sd卡:外部存储空间,相当于电脑的移动硬盘在内部存储空间中读写文件>小案例:用户输入账号密 ...

  2. Struts2--Helloworld

    搭建Struts2环境时,我们一般需要做以下几个步骤的工作: 1.找到开发Struts2应用需要使用到的jar文件. 2.创建Web工程 3.在web.xml中加入Struts2 MVC框架启动配置 ...

  3. 【转】IOS设备旋转的内部处理流程以及一些【优化建议】

    加速计是整个IOS屏幕旋转的基础,依赖加速计,设备才可以判断出当前的设备方向,IOS系统共定义了以下七种设备方向: typedef NS_ENUM(NSInteger, UIDeviceOrienta ...

  4. UnityShader之顶点片段着色器Vertex and Fragment Shader【Shader资料】

    顶点片段着色器 V&F Shader:英文全称Vertex and Fragment Shader,最强大的Shader类型,也是我们在使用ShaderLab中的重点部分,属于可编程管线,使用 ...

  5. Maven&&Ant使用

    “使用操作系统环境为CentOS-6.5” Ant使用 Maven使用 “Maven是一个项目管理和综合工具.Maven提供了开发人员构建一个完整的生命周期框架.开发团队可以自动完成项目的基础工具建设 ...

  6. spring生命周期

    Github地址 最近在整合mybatis-spring. 公司里面已经有一个叫做kylin-datasource的开发包,以前能够提供master和slave2个数据源,最近更新了2.0版本,支持自 ...

  7. [windows]利用IPSec对指定的ip进行访问限制

    以win2003系统为例: 操作(看图): 1.任务:现在192.168.2.200可访问;目的;本地禁止对其访问 2.进入:管理工具->本地安全设置->IP安全策略 3.右键创建IP安全 ...

  8. 【Other】U盘FAT32转NTFS且无数据丢失

    序: 做了一个U盘启动盘后发现文件系统格式为FAT32.这种格式支持单个文件最大4G,超过4G就无法拷贝了.为了防止以后突发情况所以提前把FAT32转换成NTFS.为避免导入导出数据最简单的方法利用D ...

  9. redis中set命令的源码分析

    首先在源码中的redis.c文件中有一个结构体:redisCommand redisCommandTable[],这个结构体中定义了每个命令对应的函数,源码中的set命令对应的函数是setComman ...

  10. 使用backbone.js、zepto.js和trigger.io开发HTML5 App

    为了力求运行速度快.响应迅即,我们推荐使用backbone.js和zepto.js. 为了让这个过程更有意思,我们开发了一个小小的示例项目,使用CSS重置样式.Backbone.js和带转场效果的几个 ...