c语言实现配置文件的读写
配置文件的格式如下:
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语言实现配置文件的读写的更多相关文章
- C语言ini格式配置文件的读写
依赖的类 /*1 utils.h *# A variety of utility functions. *# *# Some of the functions are duplicates of we ...
- C#+Access 员工信息管理--简单的增删改查操作和.ini配置文件的读写操作。
1.本程序的使用的语言是C#,数据库是Access2003.主要是对员工信息进行简单的增删改查操作和对.ini配置文件的读写操作. 2.代码运行效果如下: 功能比较简单.其中在得到查询结果后,在查询结 ...
- 配置文件Java读写
今天把配置文件的Bug修复了,总结一下Java配置文件如何读写 配置文件的格式 以.properties后缀结尾,内容不出现空格和双引号 //config.properties Driver=com. ...
- C语言编写的bmp读写程序
C语言编写的bmp读写程序 建议先把bmp的数据存储格式了解下 <span style="font-size:16px;">#include "Windows ...
- java文件操作(普通文件以及配置文件的读写操作)
转自:java文件操作(普通文件以及配置文件的读写操作) 读取普通文件 : /** * xiangqiao123欢迎你 如果对代码有疑问可以加qq群咨询:151648295 * * 读取MyFile文 ...
- java配置文件的读写
最近在做一个爬虫项目时,用到了读写配置文件的方法,记录下来以后可能用的到. Properties pro = new Properties(); boolean IsFirst = true; //从 ...
- C语言以字符形式读写文件
一.字符读取函数 fgetc (一).函数介绍 fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符.函数原型为: int fgetc(FILE* fp) fp 为文件 ...
- wamp server 3.0.0 修改默认浏览器,软件语言和配置文件编辑器
改默认IE浏览器为Chrome: wampmanager.conf : navigator ="C:\Program Files (x86)\Google\Chrome\Applicatio ...
- C语言笔记 10_文件读写&预处理器
文件读写 上一章我们讲解了 C 语言处理的标准输入和输出设备.本章我们将介绍 C 程序员如何创建.打开.关闭文本文件或二进制文件. 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节.C ...
随机推荐
- byte数组和正数BigInteger之间的相互转换
旧代码 public static void main(String[] args) { SecureRandom random = new SecureRandom(); byte[] key = ...
- 算法与数据结构基础 - 折半查找(Binary Search)
Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...
- .netcore持续集成测试篇之搭建内存服务器进行集成测试一
系列目录 在web项目里,我们把每一层的代码的单元测试都通过并不代表程序能正常运行,因为这个过程缺失了http管道,很多时候我们还还需要把项目布在iis环境中或者在vs里启动iis express服务 ...
- java swing 开发 -JTable
最近利用空闲时间自己琢磨了一下java swing 编程,其实在从事javaweb之前我一直向往的就是java swing 开发,不知道为什么可能当时觉得Windows上的exe程序很是神奇,关于wi ...
- Markdown转载
@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown ...
- 003——Netty之Buffer、Channel以及多路复用器Selector
Buffer 1.缓冲区类型 2.缓冲区定义 (1)Buffer是一个对象,其中包含写入与读出的数据.是新IO与原IO的重要区别.任何情况下访问NIO中的数据都需要通过缓存区进行操作. (2)Buff ...
- python骚操作---Print函数用法
---恢复内容开始--- python骚操作---Print函数用法 在 Python 中,print 可以打印所有变量数据,包括自定义类型. 在 3.x 中是个内置函数,并且拥有更丰富的功能. 参数 ...
- 03 requests模块基础
1. requests 模块简介 什么是requests 模块 requests模块是python中原生的基于网络请求的模块,功能强大,用法简洁高效.在爬虫领域中占据着半壁江山的地位.requests ...
- java线程池,工作窃取算法
前言 在上一篇<java线程池,阿里为什么不允许使用Executors?>中我们谈及了线程池,同时又发现一个现象,当最大线程数还没有满的时候耗时的任务全部堆积给了单个线程, 代码如下: T ...
- SSH开发模式——Struts2(第一小节)
在制定了学习计划的学习过程中,我感觉学习还是很有效率的.很短的时间内,我便学习完了JavaWeb的连接池.DbUtils框架及其一些工具类的使用. 学无止境,学习这些知识还远远不够,所以,在接下来的时 ...