配置文件的格式如下:

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. if IE语句 | 判断浏览器IE版本及添加升级提示

    本文引自:http://blog.csdn.net/u013372487/article/details/48521929 实现方法 判断当前浏览器是否IE6(或IE6内核) <!--[if I ...

  2. 基于Visual C#的AutoCAD开发——一些网址

    https://blog.csdn.net/xwebsite/article/details/5578446 http://www.cadgj.com/?p=1504

  3. Python模块之ncclient

    一.简介 此模块是是netconf协议的客户端,可与netconf服务端进行交互 二.实验环境 1.操作系统:win10 2.python版本:python3.6.6 3.ncclient模块版本:0 ...

  4. Web Worker 使用教程

    一.概述 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事.前面的任务没做完,后面的任务只能等着.随着电脑计算能力的增强,尤其是多核 CPU 的出 ...

  5. Jmeter接口自动化实例(使用Beanshell保存csv文件、csv参数化、setUp线程组)

    很久没更新博客了,荒废了很久了,今天更新一下博客,主要记录一下子最近遇到的问题和解决方法:blonde_woman: 这篇文章主要记录的是jmeter批量跑接口中遇到的各种疑难,主要涉及到的问题如下 ...

  6. 使用Counter进行计数统计

    使用Counter进行计数统计 想必大家对计数统计都不陌生吧!,简单的说就是统计某一项出现的次数.实际应用中很多需求都需要用到这个模型,如检测样本中某一值出现的次数.日志分析某一消息出现的频率分析文件 ...

  7. java多线程----悲观锁与乐观锁

    java多线程中悲观锁与乐观锁思想 一.悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线 ...

  8. GPU服务器安装NVIDIA驱动以及CUDA

    1.安装系统 系统版本: ubuntu16.04.05 LTS 分区要求: /boot 1024M swap 64G / 剩余空间

  9. [Mysql] GroupBy 分组,按天、周、月

    简单说明: 最近在做报表功能的时候,需要将数据按天.周和月进行合并展示(数据记录都是按天20190701). 正文: 说明:数据表中date都是int类型:如 20190701 一.按天 SELECT ...

  10. 详解javascript中的this的指向问题

    首先,要明白this 既不指向函数自身,也不指函数的词法作用域.this一般存在于函数中,表示当前函数的执行上下文,如果函数没有执行,那么this没有内容,只有函数在执行后this才有绑定. 然后,我 ...