INI 配置文件的格式
早期的Windows桌面系统,主要使用INI 文件作为系统的配置文件,从Win95 以后开始转向使用注册表,但是还有很多系统的配置是使用INI 文件的。其实,INI 文件就是简单的text 文件,只不过这种txt 文件要遵循一定的INI 文件格式。“.ini” 就是英文 “initialization” 的头三个字母的缩写;当然INI file 的后缀名也不一定是".ini"也可以是".cfg",".conf ”或者是".txt"。
经典格式:
INI文件的格式很简单,最基本的三个要素是:parameters,sections 和 comments。
什么是 parameters?
INI所包含的最基本的“元素”就是parameter;每一个parameter都有一个name和一个value,name和value由等号“=”隔开,name在等号的左边。
如: name = value
什么是sections ?
所有的parameters都是以sections为单位结合在一起的。所有的section名称都是独占一行,并且sections名字都被方括号包围着。在section声明后的所有parameters都是属于该section。对于一个section没有明显的结束标志符,一个section的开始就是上一个section的结束。
section 如: [section]
什么是 comments ?
在INI 文件中注释语句是以分号“;”开始的。所有的注释语句不管多长都是独占一行直到结束的。在分号和行结束符之间的所有内容都是被忽略的。
注释如: ;comments text
以下是Linux c下,对读取conf文件的实现,不支持sections。
inifile.h
- #ifndef __INIFILE_H__
- #define __INIFILE_H__
- int write_conf_value(const char *key, char *value, const char *file);
- int read_conf_value(const char *key, char *value, const char *file);
- #endif
inifile.c
- /*
- * @file:inifile.c
- * @brief initialization file read and write API implementation
- * @author WuMin
- * @date 2012-8-26
- * @version 0.1
- */
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #define MAX_READ_LINE_NUM 1024
- #define MAX_ITEM_COMMENT_NUM 50
- #define MAX_ITEMS_NUM 100
- typedef struct _item_t_ {
- char **comment;
- short num;
- char *key;
- char *value;
- } item_t;
- /* 去除字符串右端空格 */
- char *strtrimr(char *pstr)
- {
- int i;
- i = strlen(pstr) - 1;
- while (isspace(pstr[i]) && (i >= 0))
- pstr[i--] = '\0';
- return pstr;
- }
- /* 去除字符串左端空格 */
- char *strtriml(char *pstr)
- {
- int i = 0, j;
- j = strlen(pstr) - 1;
- while (isspace(pstr[i]) && (i <= j))
- i++;
- if (0 < i)
- strcpy(pstr, &pstr[i]);
- return pstr;
- }
- /* 去除字符串两端空格 */
- char *strtrim(char *pstr)
- {
- char *p;
- p = strtrimr(pstr);
- return strtriml(p);
- }
- void free_item_space(item_t * item)
- {
- int i;
- if (item == NULL)
- return;
- if (item->comment != NULL) {
- for (i = 0; i < item->num; i++) {
- free(item->comment[i]);
- item->comment[i] = NULL;
- }
- free(item->comment);
- item->comment = NULL;
- }
- item->num = 0;
- if (item->key != NULL) {
- free(item->key);
- item->key = NULL;
- }
- if (item->value != NULL) {
- free(item->value);
- item->value = NULL;
- }
- return;
- }
- /* 从配置文件读出key或value,数据返回到item_t指针 */
- int get_item_from_line(char *line, item_t * item)
- {
- char *p = NULL;
- char *p2 = NULL;
- int len = 0;
- p = strtrim(line);
- len = strlen(p);
- if (len <= 0) {
- return -1;
- } else if (p[0] == '#') {
- if (item->num > MAX_ITEM_COMMENT_NUM)
- return 1;
- if (item->comment == NULL) {
- item->comment =
- (char **)malloc(MAX_ITEM_COMMENT_NUM * sizeof(char *));
- if (item->comment == NULL) {
- printf("malloc error!\n");
- return -1;
- }
- }
- item->comment[item->num] = (char *)malloc(len + 1);
- strcpy(item->comment[item->num], p);
- item->num++;
- return 1;
- } else {
- p2 = strchr(p, '=');
- if (p2 == NULL) {
- p2 = strchr(p, ' ');
- if (p2 != NULL) {
- *p2++ = '\0';
- } else {
- return -1;
- }
- } else {
- *p2++ = '\0';
- }
- item->key = (char *)malloc(strlen(p) + 1);
- item->value = (char *)malloc(strlen(p2) + 1);
- strcpy(item->key, p);
- strcpy(item->value, p2);
- }
- return 0;
- }
- int file_to_memory(const char *file, item_t * items, int items_num)
- {
- FILE *fp = NULL;
- int i = 0, j = 0, len = 0;
- char *p = NULL;
- char *p2 = NULL;
- char line[MAX_READ_LINE_NUM];
- fp = fopen(file, "r");
- if (fp == NULL) {
- printf("file %s not exit!\n", file);
- return -1;
- }
- memset(items, 0, (items_num * sizeof(item_t)));
- while (fgets(line, MAX_READ_LINE_NUM - 1, fp)) {
- if (i >= MAX_ITEMS_NUM) {
- printf("too much items,only support 100 items!\n");
- return MAX_ITEMS_NUM;
- }
- if (!get_item_from_line(line, &items[i])) {
- i++;
- }
- }
- for (j < 0; j < i + 1; j++) {
- if (items[j].comment == NULL && items[j].key == NULL
- && items[j].value == NULL)
- break;
- }
- fclose(fp);
- fp = NULL;
- return j;
- }
- int read_conf_value(const char *key, char *value, const char *file)
- {
- FILE *fp = NULL;
- item_t item;
- char line[MAX_READ_LINE_NUM];
- if (key == NULL || value == NULL || file == NULL) {
- printf("params error!\n");
- return -1;
- }
- fp = fopen(file, "r");
- if (fp == NULL) {
- printf("file %s not exit!\n", file);
- return -1;
- }
- memset(&item, 0, sizeof(item_t));
- while (fgets(line, MAX_READ_LINE_NUM - 1, fp)) {
- if (!get_item_from_line(line, &item)) {
- if (item.key != NULL && item.value != NULL) {
- if (!strcmp(item.key, key)) {
- strcpy(value, item.value);
- break;
- }
- }
- free_item_space(&item);
- }
- }
- free_item_space(&item);
- fclose(fp);
- fp = NULL;
- return 0;
- }
- int write_conf_value(const char *key, char *value, const char *file)
- {
- int i = 0, j = 0;
- int num = 0;
- FILE *fp = NULL;
- item_t items[MAX_ITEMS_NUM];
- int flag = 0;
- if (key == NULL || value == NULL || file == NULL) {
- printf("params error!\n");
- return -1;
- }
- num = file_to_memory(file, items, MAX_ITEMS_NUM);
- if (num < 0) {
- return -1;
- }
- for (i = 0; i < num; i++) {
- if (items[i].key != NULL && items[i].value != NULL) {
- if (!strcmp(items[i].key, key)) {
- strcpy(items[i].value, value);
- flag = 1;
- break;
- }
- }
- }
- fp = fopen(file, "w");
- if (fp == NULL) {
- return -1;
- }
- for (i = 0; i < num; i++) {
- if (items[i].comment != NULL) {
- fprintf(fp, "\n");
- for (j = 0; j < items[i].num; j++) {
- if (items[i].comment[j] != NULL)
- fprintf(fp, "%s\n", items[i].comment[j]);
- }
- fprintf(fp, "\n");
- }
- if (items[i].key != NULL && items[i].value != NULL)
- fprintf(fp, "%s=%s\n", items[i].key, items[i].value);
- }
- if (flag == 0) {
- fprintf(fp, "%s=%s\n", key, value);
- }
- for (i = 0; i < num; i++) {
- free_item_space(&items[i]);
- }
- fclose(fp);
- fp = NULL;
- return 0;
- }
test.c
- #include <stdio.h>
- #include "inifile.h"
- int main(int argc,char **argv)
- {
- char value[20];
- write_conf_value("IP_SERVER", "192.168.1.101", "test.conf");
- read_conf_value("IP", value, "test.conf");
- printf("value: %s\n",value);
- return 0;
- }
test.conf
- IP=192.168.1.101
- DHCP_START=192.168.1.20
- DHCP_END=192.168.1.200
- ###############
- DOMAIN=sam
- ###############
- #
- #ffgfg
- #12 hgjgh
- IP_SERVER=192.168.1.23
- ###############
源码下载地址:
阅读(11205) | 评论(0) | 转发(3) |