C语言读取配置文件
来源:互联网 发布:linux 创建目录 编辑:程序博客网 时间:2024/05/17 01:32
配置文件的格式如下:
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得到valueint 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*/);//读取配置文件
函数实现:
1 void trim(char *strIn, char *strOut){ 2 3 char *start, *end, *temp;//定义去除空格后字符串的头尾指针和遍历指针 4 5 temp = strIn; 6 7 while (*temp == ' '){ 8 ++temp; 9 } 10 11 start = temp; //求得头指针 12 13 temp = strIn + strlen(strIn) - 1; //得到原字符串最后一个字符的指针(不是'\0') 14 15 while (*temp == ' '){ 16 --temp; 17 } 18 19 end = temp; //求得尾指针 20 21 22 for(strIn = start; strIn <= end; ){ 23 *strOut++ = *strIn++; 24 } 25 26 *strOut = '\0'; 27 } 28 29 void getValue(char * keyAndValue, char * key, char * value){ 30 31 char *p = keyAndValue; 32 33 p = strstr(keyAndValue, key); 34 if(p == NULL){ 35 //printf("没有key\n"); 36 return ; 37 } 38 39 p += strlen(key); 40 trim(p, value); 41 42 p = strstr(value, "="); 43 if(p == NULL){ 44 printf("没有=\n"); 45 return; 46 } 47 p+= strlen("="); 48 trim(p, value); 49 50 p = strstr(value, "="); 51 if(p != NULL){ 52 printf("多余的=\n"); 53 return; 54 } 55 p = value; 56 trim(p, value); 57 58 } 59 int writeCFG(const char *filename/*in*/, const char *key/*in*/, const char *value/*in*/){ 60 61 FILE *pf = NULL; 62 char ftemp[flen] = {0}, fline[1024] = {0}, *fp; //文件缓存数组 63 long fsize = 0; 64 int reg = 0; 65 int exit = 0; 66 int i = 0; 67 68 pf = fopen(filename, "r+"); 69 if(pf == NULL){ 70 pf = fopen(filename, "w+"); 71 } 72 //获得文件大小 73 fseek(pf, 0, SEEK_END); // 将文件指针指向末尾 74 fsize = ftell(pf); 75 if(fsize > flen){ 76 printf("文件不能超过8k\n"); 77 reg = -1; 78 goto end; 79 } 80 fseek(pf, 0, SEEK_SET); //将文件指针指向开头 81 82 //一行一行的读,如果存在key则修改value存到缓存数组中 83 while(!feof(pf)){ 84 fgets(fline, 1024, pf); 85 if(strstr(fline, key) != NULL && exit == 1) 86 strcpy(fline, ""); 87 if(strstr(fline, key) != NULL && exit == 0){ //判断key是否存在 88 exit = 1; 89 sprintf(fline,"%s = %s\n", key, value); 90 } 91 92 printf("fline = %s\n", fline); 93 strcat(ftemp, fline); 94 95 } 96 if(exit != 1){//如果不存在则把key value写入到最后一行 97 sprintf(fline,"%s = %s\n", key, value); 98 strcat(ftemp, fline); 99 }100 if(pf != NULL){101 fclose(pf);102 pf = fopen(filename, "w+");103 fp = (char *)malloc(sizeof(char) * strlen(ftemp) + 1);104 strcpy(fp, ftemp);105 fp[strlen(fp) - 1] = EOF;106 fputs(fp, pf);107 if(fp != NULL){108 free(fp);109 fp = NULL;110 }111 fclose(pf);112 }113 end :114 if(pf != NULL)115 fclose(pf);116 //重新创建一个以filename命名的文件117 return reg;118 }119 120 void readCFG(const char *filename/*in*/, const char *key/*in*/, const char **value/*out*/){121 122 FILE *pf = NULL;123 char line[1024] = {0}, vtemp[1024] = {0};124 125 pf = fopen(filename, "r"); //以只读方式打开126 127 while(!feof(pf)){128 fgets(line, 1024, pf);129 getValue(line, key, vtemp);130 if(strlen(vtemp) != 0)131 break;132 }133 if(strlen(vtemp) != 0){134 *value = (char *)malloc(sizeof(char) * strlen(vtemp) + 1);135 strcpy(*value, vtemp);136 } 137 else138 *value = NULL;139 if(pf != NULL)140 fclose(pf);141 }
测试:
1 #define filename "c:/cfg.ini" 2 void menu(){ 3 printf("===========================\n"); 4 printf("1 写入配置文件\n"); 5 printf("2 读取配置文件\n"); 6 printf("0 退出程序"); 7 printf("===========================\n"); 8 } 9 10 int tWrite(){11 12 char key[1024] = {0}, value[1024] = {0};13 14 printf("请输入key:");15 scanf("%s", key);16 printf("请输入value:");17 scanf("%s", value);18 printf("\n您输入的是:%s = %s\n", key, value);19 20 return writeCFG(filename/*in*/,key/*in*/,value/*in*/);21 }22 23 void tRead(){24 char key[1024] = {0}, *value;25 26 printf("请输入key:");27 scanf("%s", key);28 29 readCFG(filename/*in*/,key/*in*/, &value/*out*/);30 if(value == NULL){31 printf("没有key\n");32 return ;33 }34 printf("\nvalue = %s\n", value);35 36 if(value != NULL){37 free(value);38 value = NULL;39 }40 41 }42 int main(){43 44 int choose;45 46 while(1){47 choose = 0;48 menu();49 printf("请输入选择:");50 scanf("%d", &choose);51 switch(choose){52 case 1:53 if(tWrite() == -1)54 return -1;55 break;56 case 2:57 tRead();58 break;59 case 0:60 return 0;61 default: 62 return 0;63 }64 }65 system("pause");66 return 0;67 }
运行结果:
阅读全文
0 0
- C语言读取配置文件
- C语言读取配置文件
- C语言读取配置文件
- C语言读取配置文件
- C语言读取配置文件例子
- C语言读取配置文件代码
- 用C语言读取配置文件
- 【C/C++】C语言读取简单配置文件
- C语言读取类unix风格配置文件
- 网上找的c语言读取配置文件
- linux编程(C语言读取配置文件)
- C语言读取类unix风格配置文件
- C语言读取配置文件的另类写法
- C语言编写读取配置文件程序
- Linux C语言实现读取ini配置文件
- Linux下用C语言读取配置文件
- 用c语言实现读取配置文件源码
- C语言读取配置文件以及128字节对齐.bin配置文件
- spring-cloud-consumer-hystrix(六)
- Maven打包命令
- Unable to add window -- token null is not valid; is your activity running?
- java 学习笔记之AtomicInteger类的使用
- 无需XML的hibernate
- C语言读取配置文件
- bzoj 4916: 神犇和蒟蒻
- 最近在头痛的协作问题
- Spring与mybatis三种整合方法
- 智能小车九《不学电路图怎么造车》
- 获取系统默认语言
- Python3的ACM输入输出格式
- Mysql 数据分页处理(Node.js的实现)
- Dom4j实现xml到map转换