LINUX C 读写修改删除配置文件函数

原文地址:http://blog.csdn.net/mochouxiyan/archive/2008/09/14/2913825.aspx


*从配置文件中读取相应的值
*输入参数:1,配置文件路径 2,匹配标记 3,输出存储空间
*并且排除了空行,"="前后无内容,无"="的情况
*/

ReadConfig(char *conf_path,char *conf_name,char *config_buff)
{
char config_linebuf[256];
char line_name[40];
char exchange_buf[256];
char *config_sign = "=";
char *leave_line;
FILE *f;
f = fopen(conf_path,"r");
if(f == NULL)
{
printf("OPEN CONFIG FALID/n");
return 0;
}
fseek(f,0,SEEK_SET);
while(fgets(config_linebuf,256,f) != NULL)
{
if(strlen(config_linebuf) < 3) //判断是否是空行
{
continue;
}
if (config_linebuf[strlen(config_linebuf)-1] == 10) //去除最后一位是/n的情况
{

memset(exchange_buf,0,sizeof(exchange_buf));
strncpy(exchange_buf,config_linebuf,strlen(config_linebuf)-1);
memset(config_linebuf,0,sizeof(config_linebuf));
strcpy(config_linebuf,exchange_buf);
}
memset(line_name,0,sizeof(line_name));
leave_line = strstr(config_linebuf,config_sign);
if(leave_line == NULL) //去除无"="的情况
{
continue;
}
int leave_num = leave_line - config_linebuf;
strncpy(line_name,config_linebuf,leave_num);
if(strcmp(line_name,conf_name) ==0)
{
strncpy(config_buff,config_linebuf+(leave_num+1),strlen(config_linebuf)-leave_num-1);
break;
}
if(fgetc(f)==EOF)
{
break;
}
fseek(f,-1,SEEK_CUR);
memset(config_linebuf,0,sizeof(config_linebuf));
}
fclose(f);
}


/*
*添加修改文件(当配置文件中存在标记字段,则进行修改,若不存在则进行添加)
*
*输入参数:1,配置文件路径 2,匹配标记 3,替换或添加的内容
*
*/
AddOrAltConfig(char *conf_path,char *conf_name,char *config_buff)
{

char config_linebuf[256];
char line_name[40];
char *config_sign = "=";
char *leave_line;
int alter_sign = 0;

FILE *f;
f = fopen(conf_path,"r+");
if(f == NULL)
{
printf("OPEN CONFIG FALID/n");
return 0;
}
fseek(f,0,SEEK_END);
long congig_lenth = ftell(f);
int configbuf_lenth = strlen(config_buff);
configbuf_lenth = configbuf_lenth + 5;
char sum_buf[congig_lenth+configbuf_lenth];
memset(sum_buf,0,sizeof(sum_buf));
fseek(f,0,SEEK_SET);
while(fgets(config_linebuf,256,f) != NULL)
{
if(strlen(config_linebuf) < 3) //判断是否是空行
{
strcat(sum_buf,config_linebuf);
continue;
}
leave_line = NULL;
leave_line = strstr(config_linebuf,config_sign);
if(leave_line == NULL) //去除无"="的情况
{
strcat(sum_buf,config_linebuf);
continue;
}
int leave_num = leave_line - config_linebuf;
memset(line_name,0,sizeof(line_name));
strncpy(line_name,config_linebuf,leave_num);
if(strcmp(line_name,conf_name) ==0)
{
strcat(sum_buf,config_buff);
strcat(sum_buf,"/n");
alter_sign = 1;
}
else
{
strcat(sum_buf,config_linebuf);
}
if(fgetc(f)==EOF)
{
break;
}
fseek(f,-1,SEEK_CUR);
memset(config_linebuf,0,sizeof(config_linebuf));
}
if(alter_sign == 0)
{
strcat(sum_buf,config_buff);
strcat(sum_buf,"/n");
}
printf("---sum_buf---->%s<----------/n",sum_buf);
remove(conf_path);
fclose(f);
FILE *fp;
fp = fopen(conf_path,"w+");
if(fp == NULL)
{
printf("OPEN CONFIG FALID/n");
return 2;
}
fseek(fp,0,SEEK_SET);
fputs(sum_buf,fp);
fclose(fp);
}

/*
*删除配置文件内容(
*
*输入参数:1,配置文件路径 2,匹配标记
*
*/
DeleteConfig(char *conf_path,char *conf_name)
{

char config_linebuf[256];
char line_name[40];
char *config_sign = "=";
char *leave_line;

FILE *f;
f = fopen(conf_path,"r+");
if(f == NULL)
{
printf("OPEN CONFIG FALID/n");
return 0;
}
fseek(f,0,SEEK_END);
long congig_lenth = ftell(f);
char sum_buf[congig_lenth+2];
memset(sum_buf,0,sizeof(sum_buf));
fseek(f,0,SEEK_SET);
while(fgets(config_linebuf,256,f) != NULL)
{
if(strlen(config_linebuf) < 3) //判断是否是空行
{
strcat(sum_buf,config_linebuf);
continue;
}
leave_line = NULL;
leave_line = strstr(config_linebuf,config_sign);
if(leave_line == NULL) //去除无"="的情况
{
strcat(sum_buf,config_linebuf);
continue;
}
int leave_num = leave_line - config_linebuf;
memset(line_name,0,sizeof(line_name));
strncpy(line_name,config_linebuf,leave_num);
if(strcmp(line_name,conf_name) ==0)
{

}
else
{
strcat(sum_buf,config_linebuf);
}

if(fgetc(f)==EOF)
{
break;
}
fseek(f,-1,SEEK_CUR);
memset(config_linebuf,0,sizeof(config_linebuf));
}
printf("---sum_buf---->%s<----------/n",sum_buf);
remove(conf_path);
fclose(f);
FILE *fp;
fp = fopen(conf_path,"w+");
if(fp == NULL)
{
printf("OPEN CONFIG FALID/n");
return 2;
}
fseek(fp,0,SEEK_SET);
fputs(sum_buf,fp);
fclose(fp);
}

Powered by Zoundry Raven

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Linux C语言中,读写配置文件通常使用INI文件格式。INI文件格式是一种简单的文本文件格式,其中键值对以节(section)的形式组织,并使用方括号([])将节名括起来。 以下是一个示例INI文件: ``` [Section1] key1=value1 key2=value2 [Section2] key3=value3 key4=value4 ``` 使用C语言读取INI文件的步骤如下: 1. 打开INI文件并读入内容。 2. 解析INI文件内容,将键值对存储到内存中的数据结构中。 3. 使用存储的键值对执行相应的操作。 以下是一个简单的例子: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE_LEN 1024 #define MAX_SECTION_LEN 256 #define MAX_KEY_LEN 256 #define MAX_VALUE_LEN 256 typedef struct { char section[MAX_SECTION_LEN]; char key[MAX_KEY_LEN]; char value[MAX_VALUE_LEN]; } config_item_t; int parse_config_file(const char* filename, config_item_t** items, int* count) { FILE* fp = fopen(filename, "r"); if (!fp) { return -1; } char line[MAX_LINE_LEN]; config_item_t* item = NULL; int item_count = 0; while (fgets(line, MAX_LINE_LEN, fp)) { // 去掉行末换行符 char* p = strchr(line, '\n'); if (p) *p = '\0'; // 去掉行首空格 p = line; while (*p == ' ') ++p; // 解析节 if (*p == '[') { char* q = strchr(p, ']'); if (!q) { fclose(fp); return -1; } *q = '\0'; item = NULL; continue; } // 解析键值对 if (item) { char* q = strchr(p, '='); if (!q) continue; // 忽略无效行 *q = '\0'; strcpy(item->key, p); strcpy(item->value, q + 1); ++item; } else { // 新建配置项 item = (config_item_t*)realloc(item, (item_count + 1) * sizeof(config_item_t)); if (!item) { fclose(fp); return -1; } strcpy(item->section, p); item->key[0] = '\0'; item->value[0] = '\0'; items[item_count++] = item; } } fclose(fp); *count = item_count; return 0; } void free_config_items(config_item_t** items, int count) { for (int i = 0; i < count; ++i) { free(items[i]); } free(items); } int main() { config_item_t* items[100]; int count = 0; if (parse_config_file("test.ini", items, &count) == 0) { for (int i = 0; i < count; ++i) { printf("[%s]\n", items[i]->section); printf("%s=%s\n", items[i]->key, items[i]->value); } } free_config_items(items, count); return 0; } ``` 该程序使用`parse_config_file`函数读取INI文件并解析内容,将每个节的键值对存储到一个`config_item_t`结构体中。最后,在`main`函数中遍历所有配置项并输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值