`
steven-zhou
  • 浏览: 212308 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

配置文件操作函数--C语言实现

阅读更多
//config.h
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#define MAXLEN  256

struct PNode {
    char    *key;
    char    *value;
    struct PNode *next;
};

typedef struct {
    char    *file;
    struct PNode *first;
} Config;

Config *config_create(char *file);
void config_destroy(Config *config);
char *config_get_value(Config *config, char *key);
void *config_update_value(Config *config, char *key, char *value);
void config_save(Config *config);



//config.c
#include "config.h"

static char set_key_value(struct PNode *p, char *line);
static char *str_trim(char *pStr);
static char *str_trim_quote(char *pStr);

static char buf[MAXLEN];

Config *config_create(char *file)
{
	Config *config = malloc(sizeof(Config));
	config->file = malloc(strlen(file) + 1);
	strcpy(config->file, file);

	struct PNode *pre;
	struct PNode *p;

	FILE *fp;
	if ((fp = fopen(file, "r")) == NULL) {
		if ((fp = fopen(file, "w")) == NULL)
			goto ERR;
	}
	
	if (fgets(buf, MAXLEN, fp) == NULL) {
		fclose(fp);
		return config;
	} else {
		p = malloc(sizeof(struct PNode));
		set_key_value(p, buf);
		p->next = NULL;
		config->first = p;
		pre = p;
	}

	while (fgets(buf, MAXLEN, fp) != NULL) {
		p = malloc(sizeof(struct PNode));
		set_key_value(p, buf);
		p->next = NULL;
		pre->next = p;
		pre = p;
	}
	
	fclose(fp);
	return config;
ERR:
	free(config->file);
	free(config);
	return NULL;
}

void config_destroy(Config *config)
{
	struct PNode *pre = (config == NULL) ? NULL : config->first;
	struct PNode *p = pre;

	while (p != NULL) {
		p = p->next;
		free(pre->key);
		free(pre->value);
		free(pre);
		pre = p;
	}
	free(config->file);
	free(config);
}

void config_list(Config *config)
{
	if (config == NULL)
		return;

	fprintf(stdout, "file: %s\n", config->file);
	struct PNode *p	= config->first;
	int i = 1;
	while (p != NULL) {
		fprintf(stdout, "%d ", i++);
		fprintf(stdout, "key: %s", p->key);
		fprintf(stdout, "\t value: %s\n", p->value);
		p = p->next;
	}
}


char *config_get_value(Config *config, char *key)
{
	struct PNode *p;
	if (config == NULL)
		return NULL;
	
	p = config->first;
	while (p != NULL) {
		if (strcmp(p->key, key) == 0)
			return p->value;
		p = p->next;
	}		
}

void *config_update_value(Config *config, char *key, char *value)
{
	if (config == NULL)
		return;
	
	struct PNode *p = config->first;
	struct PNode *pre = NULL;

	while (p != NULL) {
		if (strcmp(p->key, key) == 0) {
			free(p->value);
			p->value = malloc(strlen(value) + 1);
			strcpy(p->value, value);
			return;
		}
		pre = p;
		p = p->next;
	}

	struct PNode *new = malloc(sizeof(struct PNode));
	new->key = malloc(strlen(key) + 1);
	strcpy(new->key, key);
	new->value = malloc(strlen(value) + 1);
	strcpy(new->value, value);
	new->next = NULL;

	if (pre== NULL)	config->first = new;
	else pre->next = new;
}

void config_save(Config *config)
{
	if (config == NULL)
		return;
	
	char tmpfile[1024];
	sprintf(tmpfile, "%s-bak", config->file);
	
	FILE *fp;
	if ((fp = fopen(tmpfile, "w")) == NULL)
		return;
	
	char buf[1024];
	struct PNode *p;
	for (p = config->first; p != NULL; p = p->next) {
		sprintf(buf, "%s=\"%s\"\n", p->key, p->value);
		fputs(buf, fp);		
	}
	fclose(fp);
	rename(tmpfile, config->file);
}

static char set_key_value(struct PNode *p, char *line)
{
	char *p_equal = strchr(line, '=');
	*p_equal = '\0';

	char *s = str_trim(line);
	p->key = malloc(strlen(s) + 1);
	strcpy(p->key, s);

	s = str_trim(p_equal + 1);
	s = str_trim_quote(s);
	p->value = malloc(strlen(s) + 1);
	strcpy(p->value, s);
}

static char *str_trim(char *pStr)
{
    char *pStart = pStr;
    char *pEnd = pStart + strlen(pStart) - 1;

    while(isspace(*pStart)) pStart++;
    while(isspace(*pEnd))   pEnd--;

    *(pEnd + 1) = '\0';
	return pStart;
}

static char *str_trim_quote(char *pStr)
{
	char *pStart = pStr;
	char *pEnd = pStart + strlen(pStart) - 1;
	if (*pStart == '"')	pStart++;
	if (*pEnd == '"')	pEnd--;
	*(pEnd + 1) = '\0';
	return pStart;
}

int main(int argc, char **argv)
{
	Config *config = config_create("test.conf");
	config_update_value(config, "A", "111");
	config_update_value(config, "B", "222");
	config_update_value(config, "C", "333");
	config_list(config);
	config_save(config);
	config_destroy(config);
	exit(EXIT_SUCCESS);
}



分享到:
评论

相关推荐

    SHA-1算法c语言实现

    在这个"SHA-1算法c语言实现"项目中,我们有以下文件: 1. SHA1.ncb:这是Visual Studio的一个项目文件,包含项目设置和配置信息。 2. SHA1.sln:这是一个解决方案文件,用于管理项目和解决方案的编译和调试。 3. ...

    Linux C语言的配置文件操作库

    在Linux系统中,C语言作为底层编程的主要工具,其对配置文件的操作往往涉及到繁琐的文件I/O操作。然而,为了简化这一过程,开发者通常会利用特定的库来处理配置文件,比如读取、写入、解析键值对等。本文将深入探讨...

    C语言实现的读写配置文件函数,与Windows API函数功能一样

    综上所述,使用C语言实现配置文件读写函数是一项涉及文件操作、字符串处理和错误处理的综合任务。这样的函数不仅能满足特定平台的需求,还能适应跨平台的应用场景,提高代码的复用性和可移植性。通过精心设计和实现...

    在L-edit用C语言画复杂图形f

    在`Ledit_Ellipse-master`这个压缩包中,可能包含了实现上述功能的源代码文件,包括主程序文件、头文件和可能的示例配置文件。为了理解并扩展这些功能,你需要打开源代码,阅读注释,理解各个函数的作用,然后根据...

    extractor_1.1.54.0---------------C语言代码文档提取工具

    用户可以通过命令行界面或图形用户界面进行操作,具体步骤可能包括指定输入文件、选择输出格式、设置配置选项等。 5. 配合其他工具 虽然extractor_1.1.54.0专注于文档提取,但它也可以与版本控制系统(如Git)、...

    SHA-1密码哈希算法(c语言实现)

    本文将详细介绍SHA-1算法的原理和C语言实现,并分析给定的文件内容。 SHA-1算法由美国国家安全局设计,于1993年发布,其输出是一个160位(20字节)的哈希值。SHA-1是基于消息摘要函数MD4改进而来的,但比MD4更安全...

    conf-c.zip

    conf-c基于C语言的轻量级读取/创建配置文件的函数库基于C语言的轻量级读取/创建配置文件的函数库基于C语言的轻量级读取/创建配置文件的函数库基于C语言的轻量级读取/创建配置文件的函数库基于C语言的轻量级读取/创建...

    纯C语言读写ini配置文件

    提供的两个`.mht`文件,`[ 永远的UNIX C源码通用C语言函数:文本文件有关操作,_CFG-_INI类配置文件读写 ].mht` 和 `[ 永远的UNIX C源码通用C语言函数:文本文件有关操作,_CFG-_INI类配置文件读写(对应_C的头文件 )...

    精装版---C语言详细讲解

    指针是C语言的特色之一,它存储内存地址,通过指针我们可以直接操作变量的值,实现动态内存管理和高效的数据操作。 在内存管理方面,C语言提供了`malloc()`、`calloc()`、`realloc()`和`free()`等函数来动态分配和...

    编程------C语言源代码

    描述中的“可以更加容易学习弄懂C语言结构”暗示我们将关注C语言的程序结构,包括函数定义、声明、控制流结构(条件语句和循环)以及内存管理。在C语言中,内存管理是手动进行的,通过使用malloc()和free()函数来...

    LY-51S c语言 程序

    4. Makefile或项目配置文件:用于IDE的编译和下载设置。 通过深入学习这些C语言程序,开发者可以掌握51单片机的硬件控制技巧,进一步了解嵌入式系统的开发流程,为未来更复杂的项目打下坚实基础。同时,C语言的熟练...

    C语言开发----c语言做的一个任务管理器.rar

    在C语言中实现这样的工具,开发者需要深入理解操作系统的工作原理,特别是进程管理和内存管理。 首先,我们需要理解C语言中的基本概念。C语言提供了丰富的数据类型,如int、char、float等,以及结构体来组织复杂的...

    C语言文件操作函数的封装

    在C语言中,文件操作是程序设计中必不可少的一部分。它允许我们读取、写入、创建和修改磁盘上的...通过阅读提供的“C语言文件函数的封装”压缩包,你可以找到具体的示例代码和实践应用,进一步加深对这些概念的理解。

    Win-TC-C语言编程集成工具

    6. **代码高亮和自动完成**:对C语言的关键字和常用函数进行了颜色标记,提高代码可读性;同时,部分版本还提供了简单的代码补全功能。 7. **宏和脚本**:用户可以编写自己的宏或脚本来扩展Win-TC的功能,实现个性...

    STC-开发板4-程序-C语言-V2.zip_51单片机_STC_V2 _stc程序

    这些文件将提供详细的代码实现、函数定义、配置信息以及可能的注释,帮助用户理解并使用这些程序。 总的来说,这个资源包对于学习和开发基于STC单片机的51单片机系统非常有价值,无论是对初学者还是有经验的工程师...

    windows平台简单的http_client实现POST-GET方法C语言实现

    以下是一个详尽的解释,涵盖了如何在C语言中实现这一功能的关键知识点。 首先,我们需要理解HTTP协议的基础。HTTP(超文本传输协议)是一种应用层协议,用于在Web服务器和客户端之间传输数据。HTTP有多种方法,其中...

    mex.rar_C MEX_C MEX S-Function_C MEX-file _C语言mex_mex

    C语言的底层操作能力和高效的计算性能使得MEX函数在处理大数据集或复杂算法时能显著提升执行效率。此外,C语言的库支持丰富,可以方便地调用外部库,例如BLAS和LAPACK,进一步优化计算。 **3. MEX S-Function的介绍...

    C语言 实现配置文件的编写与解析

    在C语言中,实现配置文件的编写与解析是...总的来说,C语言实现配置文件的编写与解析涉及文件操作、字符串处理、数据结构设计以及错误处理等多个方面。理解这些基本概念和技巧对于开发高效且健壮的C语言程序至关重要。

    C语言实现读写配置文件

    用纯C语言实现配置文件的读写函数,可代替WritePrivateProfileString和GetPrivateProfileString函数. 

    C语言项目实战源码-课程设计源码-毕业设计源码-c语言连连看游戏

    《C语言实现连连看游戏:源码解析与学习指南》 C语言,作为一种基础且强大的编程语言,广泛应用于计算机科学教育和项目开发中。对于计算机专业的学生来说,掌握C语言并进行实际项目练习是提升技能的重要途径。...

Global site tag (gtag.js) - Google Analytics