配置文件的格式如下:

key1 = value1

key2 = value2

  .

  .

  .

名值对以一个=链接,一条记录以换行符分割

头文件:

#include<stdio.h>
#include<stdlib.h>
#include <string.h>

函数原型:

void trim(char *strIn, char *strOut);//去除字符串首位空格

void getValue(char * keyAndValue, char * key, char * value);
//根据key得到value int writeCFG(const char *filename/*in*/, const char *key/*in*/, const char *value/*in*/);
//写入配置文件 void readCFG(const char *filename/*in*/, const char *key/*in*/, const char **value/*out*/);
//读取配置文件

函数实现:

 void trim(char *strIn, char *strOut){

     char *start, *end, *temp;//定义去除空格后字符串的头尾指针和遍历指针

     temp = strIn;

     while (*temp == ' '){
++temp;
} start = temp; //求得头指针 temp = strIn + strlen(strIn) - ; //得到原字符串最后一个字符的指针(不是'\0') while (*temp == ' '){
--temp;
} end = temp; //求得尾指针 for(strIn = start; strIn <= end; ){
*strOut++ = *strIn++;
} *strOut = '\0';
} void getValue(char * keyAndValue, char * key, char * value){ char *p = keyAndValue; p = strstr(keyAndValue, key);
if(p == NULL){
//printf("没有key\n");
return ;
} p += strlen(key);
trim(p, value); p = strstr(value, "=");
if(p == NULL){
printf("没有=\n");
return;
}
p+= strlen("=");
trim(p, value); p = strstr(value, "=");
if(p != NULL){
printf("多余的=\n");
return;
}
p = value;
trim(p, value); }
int writeCFG(const char *filename/*in*/, const char *key/*in*/, const char *value/*in*/){ FILE *pf = NULL;
char ftemp[flen] = {}, fline[] = {}, *fp; //文件缓存数组
long fsize = ;
int reg = ;
int exit = ;
int i = ; pf = fopen(filename, "r+");
if(pf == NULL){
pf = fopen(filename, "w+");
}
//获得文件大小
fseek(pf, , SEEK_END); // 将文件指针指向末尾
fsize = ftell(pf);
if(fsize > flen){
printf("文件不能超过8k\n");
reg = -;
goto end;
}
fseek(pf, , SEEK_SET); //将文件指针指向开头 //一行一行的读,如果存在key则修改value存到缓存数组中
while(!feof(pf)){
fgets(fline, , pf);
if(strstr(fline, key) != NULL && exit == )
strcpy(fline, "");
if(strstr(fline, key) != NULL && exit == ){ //判断key是否存在
exit = ;
sprintf(fline,"%s = %s\n", key, value);
} printf("fline = %s\n", fline);
strcat(ftemp, fline); }
if(exit != ){//如果不存在则把key value写入到最后一行
sprintf(fline,"%s = %s\n", key, value);
strcat(ftemp, fline);
}
if(pf != NULL){
fclose(pf);
pf = fopen(filename, "w+");
fp = (char *)malloc(sizeof(char) * strlen(ftemp) + );
strcpy(fp, ftemp);
fp[strlen(fp) - ] = EOF;
fputs(fp, pf);
if(fp != NULL){
free(fp);
fp = NULL;
}
fclose(pf);
}
end :
if(pf != NULL)
fclose(pf);
//重新创建一个以filename命名的文件
return reg;
} void readCFG(const char *filename/*in*/, const char *key/*in*/, const char **value/*out*/){ FILE *pf = NULL;
char line[] = {}, vtemp[] = {}; pf = fopen(filename, "r"); //以只读方式打开 while(!feof(pf)){
fgets(line, , pf);
getValue(line, key, vtemp);
if(strlen(vtemp) != )
break;
}
if(strlen(vtemp) != ){
*value = (char *)malloc(sizeof(char) * strlen(vtemp) + );
strcpy(*value, vtemp);
}
else
*value = NULL;
if(pf != NULL)
fclose(pf);
}

测试:

 #define filename "c:/cfg.ini"
void menu(){
printf("===========================\n");
printf("1 写入配置文件\n");
printf("2 读取配置文件\n");
printf("0 退出程序");
printf("===========================\n");
} int tWrite(){ char key[] = {}, value[] = {}; printf("请输入key:");
scanf("%s", key);
printf("请输入value:");
scanf("%s", value);
printf("\n您输入的是:%s = %s\n", key, value); return writeCFG(filename/*in*/,key/*in*/,value/*in*/);
} void tRead(){
char key[] = {}, *value; printf("请输入key:");
scanf("%s", key); readCFG(filename/*in*/,key/*in*/, &value/*out*/);
if(value == NULL){
printf("没有key\n");
return ;
}
printf("\nvalue = %s\n", value); if(value != NULL){
free(value);
value = NULL;
} }
int main(){ int choose; while(){
choose = ;
menu();
printf("请输入选择:");
scanf("%d", &choose);
switch(choose){
case :
if(tWrite() == -)
return -;
break;
case :
tRead();
break;
case :
return ;
default:
return ;
}
}
system("pause");
return ;
}

运行结果:

c语言实现配置文件的读写的更多相关文章

  1. C语言ini格式配置文件的读写

    依赖的类 /*1 utils.h *# A variety of utility functions. *# *# Some of the functions are duplicates of we ...

  2. C#+Access 员工信息管理--简单的增删改查操作和.ini配置文件的读写操作。

    1.本程序的使用的语言是C#,数据库是Access2003.主要是对员工信息进行简单的增删改查操作和对.ini配置文件的读写操作. 2.代码运行效果如下: 功能比较简单.其中在得到查询结果后,在查询结 ...

  3. 配置文件Java读写

    今天把配置文件的Bug修复了,总结一下Java配置文件如何读写 配置文件的格式 以.properties后缀结尾,内容不出现空格和双引号 //config.properties Driver=com. ...

  4. C语言编写的bmp读写程序

    C语言编写的bmp读写程序 建议先把bmp的数据存储格式了解下 <span style="font-size:16px;">#include "Windows ...

  5. java文件操作(普通文件以及配置文件的读写操作)

    转自:java文件操作(普通文件以及配置文件的读写操作) 读取普通文件 : /** * xiangqiao123欢迎你 如果对代码有疑问可以加qq群咨询:151648295 * * 读取MyFile文 ...

  6. java配置文件的读写

    最近在做一个爬虫项目时,用到了读写配置文件的方法,记录下来以后可能用的到. Properties pro = new Properties(); boolean IsFirst = true; //从 ...

  7. C语言以字符形式读写文件

    一.字符读取函数 fgetc (一).函数介绍 fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符.函数原型为: int fgetc(FILE* fp) fp 为文件 ...

  8. wamp server 3.0.0 修改默认浏览器,软件语言和配置文件编辑器

    改默认IE浏览器为Chrome: wampmanager.conf : navigator ="C:\Program Files (x86)\Google\Chrome\Applicatio ...

  9. C语言笔记 10_文件读写&预处理器

    文件读写 上一章我们讲解了 C 语言处理的标准输入和输出设备.本章我们将介绍 C 程序员如何创建.打开.关闭文本文件或二进制文件. 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节.C ...

随机推荐

  1. oracle RAC LOG_ARCHIVE_DEST_1 与 LOG_ARCHIVE_DEST 冲突解决

    在做 oracle RAC 归档日志配置时,出现了一个错误,开始看资料的时候, 注意到了 LOG_ARCHIVE_DEST_n 与 LOG_ARCHIVE_DEST 不能同时使用, 但在配置的时候并没 ...

  2. 重读《学习JavaScript数据结构与算法-第三版》- 第3章 数组(一)

    定场诗 大将生来胆气豪,腰横秋水雁翎刀. 风吹鼍鼓山河动,电闪旌旗日月高. 天上麒麟原有种,穴中蝼蚁岂能逃. 太平待诏归来日,朕与先生解战袍. 此处应该有掌声... 前言 读<学习JavaScr ...

  3. HashMap这些问题你知道吗?

    HashMap是Java面试中的常考点之一,而且其<Key,Value>结构也是开发中常常用到的结构之一.或许你使用过HashMap,但是你知道下面这些问题吗? HashMap的底层结构是 ...

  4. Mock Server的搭建

    一.概述 我们系统与第三方开票系统有交互,场景是我们系统请求第三方开票系统,第三方开票系统根据我们的请求数据,生成开票信息然后返回发票号或异常信息,我们根据返回的信息做对应的处理.因为配合上存在一些障 ...

  5. java后端_百度一面

    参考: https://www.nowcoder.com/discuss/215891?type=2&order=0&pos=10&page=1 1.会啥框架.不会. 2.锁的 ...

  6. 后端开发实践系列之三——事件驱动架构(EDA)编码实践

    在本系列的前两篇文章中,笔者分别讲到了后端项目的代码模板和DDD编码实践,在本文中,我将继续以编码实践的方式分享如何落地事件驱动架构. 单纯地讲事件驱动架构(Event Driven Architec ...

  7. HMM学习

    参看博客: 1.https://www.cnblogs.com/skyme/p/4651331.html 2.https://blog.csdn.net/continueoo/article/deta ...

  8. Hadoop RPC机制详解

    网络通信模块是分布式系统中最底层的模块,他直接支撑了上层分布式环境下复杂的进程间通信逻辑,是所有分布式系统的基础.远程过程调用(RPC)是一种常用的分布式网络通信协议,他允许运行于一台计算机的程序调用 ...

  9. ‎CocosBuilder 学习笔记(1) CCBReader 解析.ccbi文件流程

    1. 简介 CocosBuilder是免费开源的Cocos2d UI编辑器. .ccb文件是CCB项目的原始文件. .ccbi文件是CCB项目发布后的生成的二进制文件.CCBReader可以快速通过该 ...

  10. Leetcode之二分法专题-275. H指数 II(H-Index II)

    Leetcode之二分法专题-275. H指数 II(H-Index II) 给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列.编写一个方法,计算出研究者的 h 指数. ...