//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语言实现"项目中,我们有以下文件: 1. SHA1.ncb:这是Visual Studio的一个项目文件,包含项目设置和配置信息。 2. SHA1.sln:这是一个解决方案文件,用于管理项目和解决方案的编译和调试。 3. ...
在Linux系统中,C语言作为底层编程的主要工具,其对配置文件的操作往往涉及到繁琐的文件I/O操作。然而,为了简化这一过程,开发者通常会利用特定的库来处理配置文件,比如读取、写入、解析键值对等。本文将深入探讨...
综上所述,使用C语言实现配置文件读写函数是一项涉及文件操作、字符串处理和错误处理的综合任务。这样的函数不仅能满足特定平台的需求,还能适应跨平台的应用场景,提高代码的复用性和可移植性。通过精心设计和实现...
在`Ledit_Ellipse-master`这个压缩包中,可能包含了实现上述功能的源代码文件,包括主程序文件、头文件和可能的示例配置文件。为了理解并扩展这些功能,你需要打开源代码,阅读注释,理解各个函数的作用,然后根据...
用户可以通过命令行界面或图形用户界面进行操作,具体步骤可能包括指定输入文件、选择输出格式、设置配置选项等。 5. 配合其他工具 虽然extractor_1.1.54.0专注于文档提取,但它也可以与版本控制系统(如Git)、...
本文将详细介绍SHA-1算法的原理和C语言实现,并分析给定的文件内容。 SHA-1算法由美国国家安全局设计,于1993年发布,其输出是一个160位(20字节)的哈希值。SHA-1是基于消息摘要函数MD4改进而来的,但比MD4更安全...
conf-c基于C语言的轻量级读取/创建配置文件的函数库基于C语言的轻量级读取/创建配置文件的函数库基于C语言的轻量级读取/创建配置文件的函数库基于C语言的轻量级读取/创建配置文件的函数库基于C语言的轻量级读取/创建...
提供的两个`.mht`文件,`[ 永远的UNIX C源码通用C语言函数:文本文件有关操作,_CFG-_INI类配置文件读写 ].mht` 和 `[ 永远的UNIX C源码通用C语言函数:文本文件有关操作,_CFG-_INI类配置文件读写(对应_C的头文件 )...
指针是C语言的特色之一,它存储内存地址,通过指针我们可以直接操作变量的值,实现动态内存管理和高效的数据操作。 在内存管理方面,C语言提供了`malloc()`、`calloc()`、`realloc()`和`free()`等函数来动态分配和...
描述中的“可以更加容易学习弄懂C语言结构”暗示我们将关注C语言的程序结构,包括函数定义、声明、控制流结构(条件语句和循环)以及内存管理。在C语言中,内存管理是手动进行的,通过使用malloc()和free()函数来...
4. Makefile或项目配置文件:用于IDE的编译和下载设置。 通过深入学习这些C语言程序,开发者可以掌握51单片机的硬件控制技巧,进一步了解嵌入式系统的开发流程,为未来更复杂的项目打下坚实基础。同时,C语言的熟练...
在C语言中实现这样的工具,开发者需要深入理解操作系统的工作原理,特别是进程管理和内存管理。 首先,我们需要理解C语言中的基本概念。C语言提供了丰富的数据类型,如int、char、float等,以及结构体来组织复杂的...
在C语言中,文件操作是程序设计中必不可少的一部分。它允许我们读取、写入、创建和修改磁盘上的...通过阅读提供的“C语言文件函数的封装”压缩包,你可以找到具体的示例代码和实践应用,进一步加深对这些概念的理解。
6. **代码高亮和自动完成**:对C语言的关键字和常用函数进行了颜色标记,提高代码可读性;同时,部分版本还提供了简单的代码补全功能。 7. **宏和脚本**:用户可以编写自己的宏或脚本来扩展Win-TC的功能,实现个性...
这些文件将提供详细的代码实现、函数定义、配置信息以及可能的注释,帮助用户理解并使用这些程序。 总的来说,这个资源包对于学习和开发基于STC单片机的51单片机系统非常有价值,无论是对初学者还是有经验的工程师...
以下是一个详尽的解释,涵盖了如何在C语言中实现这一功能的关键知识点。 首先,我们需要理解HTTP协议的基础。HTTP(超文本传输协议)是一种应用层协议,用于在Web服务器和客户端之间传输数据。HTTP有多种方法,其中...
C语言的底层操作能力和高效的计算性能使得MEX函数在处理大数据集或复杂算法时能显著提升执行效率。此外,C语言的库支持丰富,可以方便地调用外部库,例如BLAS和LAPACK,进一步优化计算。 **3. MEX S-Function的介绍...
在C语言中,实现配置文件的编写与解析是...总的来说,C语言实现配置文件的编写与解析涉及文件操作、字符串处理、数据结构设计以及错误处理等多个方面。理解这些基本概念和技巧对于开发高效且健壮的C语言程序至关重要。
用纯C语言实现配置文件的读写函数,可代替WritePrivateProfileString和GetPrivateProfileString函数.
《C语言实现连连看游戏:源码解析与学习指南》 C语言,作为一种基础且强大的编程语言,广泛应用于计算机科学教育和项目开发中。对于计算机专业的学生来说,掌握C语言并进行实际项目练习是提升技能的重要途径。...