首页 > 编程知识 正文

c语言char默认值,python字典键值对

时间:2023-05-05 18:50:54 阅读:41963 作者:93

Linux-C的简单键值对配置读写一、简述

- -在--linux下使用c语言读写简单的键-值对配置。 与Qt的QSetting相似。

二、测试代码

配置读:使用fgets函数读取每一行数据,然后匹配key,再取value

配置写:如果没有这个key就追加,如果已有就修改value,再重新写入文件, 注意修改的内容可能会导致文件大小变小,此时需要重新设置文件大小进行文件截断。如果修改后文件大小变大它会自动拓展,此时可不用设置文件大小。

# include stdio.h # include unistd.h # include string.h # define setting _ file '/home/Liang/setting _ dir/test.h define setting _ version _ key ' version '/*配置版本key */# define define setting _ line _ max _ len 256/*最大配置长度*/# dedene define setting _ len (setting _ line _ max-setting _ key _ max _ len-2 )/*最大值长度预约((0), '=' */# define setting _ split _ char '='/* key和value分隔符*/* * * * * * * * * * * * * * * * * * * * *。 获取了形状参数: const char *path -配置文件* const char *key -键* const char * key-value * intvalue _ _ )返回值: value 0。 未找到key 0: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *。 int cnt=0; int key_len; int line_len; int value_len; file * FP charline _ buf [ setting _ line _ max _ len ]={0}; /*合法性判断*/if (null==path|| null==key|| null==value||0=value _ max _ len ) {return -1; }key_len=Strlen(key ); if (0=key _ len|| setting _ key _ max _ lenkey _ len ) {return -2; (if ) f_ok!=访问(path,F_OK ) ) {return -3; }/*打开文件*/FP=fopen (路径,' r ' ); if(null==FP ) {return -4; 匹配(/)扫描线、key(/while )!=fgets(line_buf,SETTING_LINE_MAX_LEN-1,fp ) ) line_len=strlen ) line_buf ); if (line _ lenkey_len ) {/* key */if (0==strncmp (line _ buf,key,key _ len ) setting_split_char==}消息(line_buf,0,sizeof ) line_buf ); /*最大搜索行限制*/cnt; if(setting_line_maxCNT ) {break; }/*关闭文件*/fclose(FP );/*找到key,然后单击value*/if(1==ret ) {value_len=line_len - key_len - 1; if(0value_len ) if ) { value _ len=value _ max _ len } { value _ len=value _ max _ len; }/*副本value*/strncpy(value,line_buf[key_len 1],va

lue_len);value[value_len] = '';/* 去掉结尾的换行符 */if ('n' == value[value_len-1]) {value[value_len-1] = '';}if (2 <= value_len && 'r' == value[value_len-2]) {value[value_len-2] = '';}} else {value[0] = '';}}return ret;}/********************************************************************************* * 函数名: SetSetting * 功能:根据key设置value,如果key不存在就会追加 * 形参:const char *path -> 配置文件 * const char *key -> 键 * const char *key -> value * 返回值:>=0:设置成功 <0:获取失败 *******************************************************************************/int SetSetting(const char *path, const char *key, const char *value){int i, j;int fd;int tmp_data_cnt = 0;int ret = 0;int cnt = 0;int key_len; int line_len;int value_len;int len;FILE *fp = NULL;char tmp_key[SETTING_KEY_MAX_LEN+1] = {0};char tmp_value[SETTING_VALUE_MAX_LEN+1] = {0};char line_buf[SETTING_LINE_MAX_LEN] = {0};char tmp_data_buf[SETTING_LINE_MAX][SETTING_LINE_MAX_LEN] = {0};/* 合法性判断 */if (NULL == path || NULL == key || NULL == value) {return -1;}key_len = strlen(key);if (0 >= key_len || SETTING_KEY_MAX_LEN < key_len) {return -2;}/* key去掉rn */for (i = 0, j = 0; i < key_len; i++) {if ('r' == key[i] || 'n' == key[i]) {break;}tmp_key[j++] = key[i];}key_len = j;value_len = strlen(value);if (SETTING_VALUE_MAX_LEN < value_len) {value_len = SETTING_VALUE_MAX_LEN;} else if (value_len <= 0) {value_len = 0;}/* value去掉rn */for (i = 0, j = 0; i < value_len; i++) {if ('r' == value[i] || 'n' == value[i]) {break;}tmp_value[j++] = value[i];}value_len = j;/* 配置不存在就新建配置文件 */if (F_OK != access(path, F_OK)) {fp = fopen(path, "w+");if (NULL == fp) {return -3;}/*写入版本信息 */sprintf(line_buf, "%s%c%sn", SETTING_VERSION_KEY, SETTING_SPLIT_CHAR, SETTING_VERSION_VALUE);line_len = strlen(line_buf);ret = fwrite(line_buf, 1, line_len, fp);/* 新建key */memset(line_buf, 0, sizeof(line_buf));sprintf(line_buf, "%s%c%sn", tmp_key, SETTING_SPLIT_CHAR, tmp_value);line_len = strlen(line_buf);if (line_len != fwrite(line_buf, 1, line_len, fp)) {ret = -4;} else {ret = 2;}fclose(fp);return ret;}/* 打开文件 */if (NULL == fp) {fp = fopen(path, "r+");if (NULL == fp) {return -5;}}/* 遍历行,匹配Key */while(NULL != fgets(line_buf, SETTING_LINE_MAX_LEN-1, fp)) {line_len = strlen(line_buf);if (line_len > key_len) {if (1 != ret && 0 == strncmp(line_buf, tmp_key, key_len) && SETTING_SPLIT_CHAR == line_buf[key_len]) {ret = 1;/* 修改value */sprintf(line_buf, "%s%c%sn", tmp_key, SETTING_SPLIT_CHAR, tmp_value);}}/* 备份数据,有修改就需要重新写入文件*/strcpy(tmp_data_buf[tmp_data_cnt++], line_buf);memset(line_buf, 0, sizeof(line_buf));/* 最大查找行限制 */cnt++;if (SETTING_LINE_MAX < cnt) {break;}}/* 找到key,需要重新写入数据并更新文件大小 */if (1 == ret) {rewind(fp);for (i = 0; i < tmp_data_cnt; i++) {fputs(tmp_data_buf[i], fp);}/* 重新设置文件大小 */len = ftell(fp);fd = fileno(fp);ftruncate(fd, len);} else { /* 新的key,在最后面追加 */if (SETTING_LINE_MAX > cnt) {sprintf(line_buf, "%s%c%sn", tmp_key, SETTING_SPLIT_CHAR, tmp_value);line_len = strlen(line_buf);if (line_len != fwrite(line_buf, 1, line_len, fp)) {ret = -6;}} else {ret = -7;}}/* 关闭文件 */fclose(fp);return ret;}int main(int argc, char *argv[]){int ret;char value[16];/* 读取版本 */memset(value, 0, sizeof(value));ret = GetSetting(SETTING_FILE, SETTING_VERSION_KEY, value, 10);printf("GetSetting %s ret:%d, value:[%s]n", SETTING_VERSION_KEY, ret, value);/* 设置name */ret = SetSetting(SETTING_FILE, "name", "Genven_Liang");printf("SetSetting name ret:%dn", ret);/* 读取name */memset(value, 0, sizeof(value));ret = GetSetting(SETTING_FILE, "name", value, sizeof(value));printf("GetSetting name ret:%d, value:[%s]n", ret, value);/* 设置name */ret = SetSetting(SETTING_FILE, "name", "");printf("SetSetting name ret:%dn", ret);/* 读取name */memset(value, 0, sizeof(value));ret = GetSetting(SETTING_FILE, "name", value, sizeof(value));printf("GetSetting name ret:%d, value:[%s]n", ret, value);/* 设置name */ret = SetSetting(SETTING_FILE, "name", "zhangsanrn123");printf("SetSetting name ret:%dn", ret);/* 读取name */memset(value, 0, sizeof(value));ret = GetSetting(SETTING_FILE, "name", value, sizeof(value));printf("GetSetting name ret:%d, value:[%s]n", ret, value);/* 读取版本 */memset(value, 0, sizeof(value));ret = GetSetting(SETTING_FILE, SETTING_VERSION_KEY, value, 10);printf("GetSetting %s ret:%d, value:[%s]n", SETTING_VERSION_KEY, ret, value);return 0;}

三、测试效果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。