3_15_GLib库入门与实践_Key-Value风格文件解析

GKeyFile是用于解析和操作键值对文件的库,常用于处理freedesktop.org标准的配置文件。它支持读取、写入、设置和删除键值对,以及处理本地化字符串和不同数据类型。本文通过示例展示了如何从文件加载数据、获取和设置键值、删除键和组,并对比了key-value文件与ini文件的区别。
摘要由CSDN通过智能技术生成

简介

GKeyFile是一个key-value文件解析器,可以解析key-value文件,也可以对文件进行修改。key-value文件和ini文件非常相似,但又有不同(不同点见本章专题),freedesktop.org的很多标准都采用了key-value文件,如Desktop Entry Specification 标准及Icon Theme Specification

数据结构

GKeyFile是一个不透明的结构体。

typedef struct _GKeyFile GKeyFile;

函数列表

GKeyFile *	g_key_file_new ()
void	g_key_file_free ()
GKeyFile *	g_key_file_ref ()
void	g_key_file_unref ()
void	g_key_file_set_list_separator ()
gboolean	g_key_file_load_from_file ()
gboolean	g_key_file_load_from_data ()
gboolean	g_key_file_load_from_bytes ()
gboolean	g_key_file_load_from_data_dirs ()
gboolean	g_key_file_load_from_dirs ()
gchar *	g_key_file_to_data ()
gboolean	g_key_file_save_to_file ()
gchar *	g_key_file_get_start_group ()
gchar **	g_key_file_get_groups ()
gchar **	g_key_file_get_keys ()
gboolean	g_key_file_has_group ()
gboolean	g_key_file_has_key ()
gchar *	g_key_file_get_value ()
gchar *	g_key_file_get_string ()
gchar *	g_key_file_get_locale_string ()
gchar *	g_key_file_get_locale_for_key ()
gboolean	g_key_file_get_boolean ()
gint	g_key_file_get_integer ()
gint64	g_key_file_get_int64 ()
guint64	g_key_file_get_uint64 ()
gdouble	g_key_file_get_double ()
gchar **	g_key_file_get_string_list ()
gchar **	g_key_file_get_locale_string_list ()
gboolean *	g_key_file_get_boolean_list ()
gint *	g_key_file_get_integer_list ()
gdouble *	g_key_file_get_double_list ()
gchar *	g_key_file_get_comment ()
void	g_key_file_set_value ()
void	g_key_file_set_string ()
void	g_key_file_set_locale_string ()
void	g_key_file_set_boolean ()
void	g_key_file_set_integer ()
void	g_key_file_set_int64 ()
void	g_key_file_set_uint64 ()
void	g_key_file_set_double ()
void	g_key_file_set_string_list ()
void	g_key_file_set_locale_string_list ()
void	g_key_file_set_boolean_list ()
void	g_key_file_set_integer_list ()
void	g_key_file_set_double_list ()
gboolean	g_key_file_set_comment ()
gboolean	g_key_file_remove_group ()
gboolean	g_key_file_remove_key ()
gboolean	g_key_file_remove_comment ()

函数功能分类

// 创建GKeyFile对象
GKeyFile *	g_key_file_new ()

// 释放GKeyFile对象
void	g_key_file_free ()

// 引用解引用
GKeyFile *	g_key_file_ref ()
void	g_key_file_unref ()

// 设置值分隔符,默认分隔符为分号
void	g_key_file_set_list_separator ()

// 加载数据
// 从文件加载
gboolean	g_key_file_load_from_file ()
// 从内存加载
gboolean	g_key_file_load_from_data ()
// 从GBytes加载
gboolean	g_key_file_load_from_bytes ()
// 从默认用户目录或系统目录查找文件并加载
gboolean	g_key_file_load_from_data_dirs ()
// 从指定目录搜索文件文件并加载
gboolean	g_key_file_load_from_dirs ()

// key_file转换成字符串
gchar *	g_key_file_to_data ()

// 保存
// 将key_file保存到文件
gboolean	g_key_file_save_to_file ()

// 查找
// 是否有指定的组
gboolean	g_key_file_has_group ()
// 是否有指定的key
gboolean	g_key_file_has_key ()

// 获取get
// 获取第一个组的组名
gchar *	g_key_file_get_start_group ()
// 获取所有的组
gchar **	g_key_file_get_groups ()
// 获取一个组下的所有键
gchar **	g_key_file_get_keys ()

// 获取key的原始格式值
gchar *	g_key_file_get_value ()
gchar *	g_key_file_get_string ()
// 获取本地化字符串
gchar *	g_key_file_get_locale_string ()
// 获取键的本地化值
gchar *	g_key_file_get_locale_for_key ()
// 根据键获取不同类型的值
gboolean	g_key_file_get_boolean ()
gint	g_key_file_get_integer ()
gint64	g_key_file_get_int64 ()
guint64	g_key_file_get_uint64 ()
gdouble	g_key_file_get_double ()
// 根据键获取不同类型的多个值
gchar **	g_key_file_get_string_list ()
gchar **	g_key_file_get_locale_string_list ()
gboolean *	g_key_file_get_boolean_list ()
gint *	g_key_file_get_integer_list ()
gdouble *	g_key_file_get_double_list ()
// 获取注释
gchar *	g_key_file_get_comment ()

// 设置set
// 设置值
void	g_key_file_set_value ()
// 设置字符串
void	g_key_file_set_string ()
// 设置本地化字符串
void	g_key_file_set_locale_string ()
// 设置不同格式的值
void	g_key_file_set_boolean ()
void	g_key_file_set_integer ()
void	g_key_file_set_int64 ()
void	g_key_file_set_uint64 ()
void	g_key_file_set_double ()
// 设置不同格式的一组值
void	g_key_file_set_string_list ()
void	g_key_file_set_locale_string_list ()
void	g_key_file_set_boolean_list ()
void	g_key_file_set_integer_list ()
void	g_key_file_set_double_list ()
// 设置注释
gboolean	g_key_file_set_comment ()

// 删除
// 删除一个组
gboolean	g_key_file_remove_group ()
// 删除一个键
gboolean	g_key_file_remove_key ()
// 删除注释
gboolean	g_key_file_remove_comment ()

函数功能说明及综合演示

键值获取

本程序演示从key-value文件读取内容,根据指定的值获取对应的字符串,获取所有组名,获取key的所有整型值。
g_key_file_get_valueg_key_file_get_string的区别:

  • get_value获取的是原始字符串
  • get_string获取的是转义后的字符串

一个key可以有多个值,一般默认是分号分隔,也可以使用
g_key_file_set_list_separator修改成其他字符。

key-value文件内容:

# this is just an example
# there can be comments before the first group

[First Group]

Name=Key File Example\tthis value shows\nescaping

# localized strings are stored in multiple key-value pairs
Welcome=Hello
Welcome[de]=Hallo
Welcome[fr_FR]=Bonjour
Welcome[it]=Ciao
Welcome[be@latin]=Hello

[Another Group]

Numbers=2;20;-200;0

Booleans=true;false;true;true

演示程序:
源码见glib_examples\glib_keyfile\glib_keyfile_get

#include <glib.h>
#define TEST_KEY_FILE_BASIC_FILE "./keyfile_get.ini"
gint main(gint argc, gchar *argv) 
{
    gboolean ret = FALSE;
    GKeyFile *key_file = NULL;
    gchar *first_group_name_val = NULL;
    gint i = 0;
    gchar **group_names;
    gsize len = 0;
    gint *int_val = NULL;
    key_file = g_key_file_new ();
    if(NULL == key_file) {
        g_print("key file new failed! \n");
    }
    ret = g_key_file_load_from_file(key_file, TEST_KEY_FILE_BASIC_FILE, 0, NULL);
    if(FALSE == ret) {
        g_print("key file load failed \n");
        return -1;
    }
    /* get value */
    g_print("******************** \n");
    g_print("get value \n");
    first_group_name_val = g_key_file_get_value(key_file, "First Group", "Name", NULL);
    if(NULL == first_group_name_val) {
        return -1;
    }
    g_print("(get value)first_group_name_val is %s \n", first_group_name_val);
    g_free(first_group_name_val);
    /* get string */
    g_print("******************** \n");
    g_print("get string \n");
    first_group_name_val = g_key_file_get_string(key_file, "First Group", "Name", NULL);
    if(NULL == first_group_name_val) {
        return -1;
    }
    g_print("(get string)first_group_name_val is %s \n", first_group_name_val);
    g_free(first_group_name_val);
    /* get groups */
    g_print("******************** \n");
    g_print("get groups \n");
    group_names = g_key_file_get_groups(key_file, &len);
    while(NULL != group_names[i]) {
        g_print("group_name[%d] is: %s \n", i++, group_names[i]);
    }
    g_strfreev(group_names);
    /* get interger list */
    g_print("******************** \n");
    g_print("get interger list \n");
    len = 0;
    i = 0;
    int_val = g_key_file_get_integer_list(key_file, "Another Group", "Numbers", &len, NULL);
    for(i=0;i<len;i++) {
        g_print("int_val[%d]:%d \n", i, int_val[i]);
    }
    g_free(int_val);
    g_key_file_free(key_file);
    return 0;
}

运行结果:

[root@centos7_6 glib_keyfile_get]# ./glib_keyfile_get
********************
get value
(get value)first_group_name_val is Key File Example\tthis value shows\nescaping
********************
get string
(get string)first_group_name_val is Key File Example    this value shows
escaping
********************
get groups
group_name[0] is: First Group
group_name[1] is: Another Group
********************
get interger list
int_val[0]:2
int_val[1]:20
int_val[2]:-200
int_val[3]:0
键值设置

本程序演示设置键值并保存到文件。用到的函数为g_key_file_set_xxxg_key_file_save_to_file

key-value文件内容:

# this is just an example
# there can be comments before the first group

[First Group]

Name=Key File Example\tthis value shows\nescaping

[Another Group]

Numbers=2;20;-200;0

Booleans=true;false;true;true

演示程序:
源码见glib_examples\glib_keyfile\glib_keyfile_set_save


#include <glib.h>
#define TEST_KEY_FILE_BASIC_FILE "./keyfile_set_save.ini"
gint main(gint argc, gchar *argv) 
{
    gboolean ret = FALSE;
    GKeyFile *key_file = NULL;
    gchar *contents = NULL;
    gsize length = 0;
    gboolean bools[2] = { TRUE, FALSE };
    g_file_get_contents(TEST_KEY_FILE_BASIC_FILE, &contents, &length, NULL);
    g_print("before set:\n%s\n", contents);
    g_free(contents);
    key_file = g_key_file_new ();
    if(NULL == key_file) {
        g_print("key file new failed! \n");
    }
    ret = g_key_file_load_from_file(key_file, TEST_KEY_FILE_BASIC_FILE, 0, NULL);
    if(FALSE == ret) {
        g_print("key file load failed \n");
        return -1;
    }
    /* set value */
    g_print("******************** \n");
    g_print("set value \n");
    g_key_file_set_value(key_file, "Another Group", "New Item", "abcdefg");
    /* set group */
    g_print("******************** \n");
    g_print("set group and bool list \n");
    g_key_file_set_boolean_list(key_file, "New Group", "Bools", bools, 2);
    g_key_file_save_to_file(key_file, TEST_KEY_FILE_BASIC_FILE, NULL);
    g_key_file_free(key_file);
    g_file_get_contents(TEST_KEY_FILE_BASIC_FILE, &contents, &length, NULL);
    g_print("after set:\n%s\n", contents);
    g_free(contents);
    return 0;
}

运行结果:

[root@centos7_6 glib_keyfile_set_save]# ./glib_keyfile_set_save
before set:
# this is just an example
# there can be comments before the first group

[First Group]

Name=Key File Example\tthis value shows\nescaping

[Another Group]

Numbers=2;20;-200;0

Booleans=true;false;true;true
********************
set value
********************
set group and bool list
after set:
[First Group]
Name=Key File Example\tthis value shows\nescaping

[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true
New Item=abcdefg

[New Group]
Bools=true;false;
键删除

本程序演示删除键和删除整组。用到的函数为g_key_file_remove_keyg_key_file_remove_group

key-value文件内容:

# this is just an example
# there can be comments before the first group
[First Group]
Name=Key File Example\tthis value shows\nescaping
[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true
[Third Group]
AAA=100
BBB=true;false;true;true
[Fourth Group]
DeleteMe=abcdefg
DeleteThem=100;200;300;400

演示程序:
源码见glib_examples\glib_keyfile\glib_keyfile_remove

#include <glib.h>
#define TEST_KEY_FILE_BASIC_FILE "./keyfile_remove.ini"
gint main(gint argc, gchar *argv) 
{
    gboolean ret = FALSE;
    GKeyFile *key_file = NULL;
    gchar *contents = NULL;
    gsize length = 0;
    gboolean bools[2] = { TRUE, FALSE };
    g_file_get_contents(TEST_KEY_FILE_BASIC_FILE, &contents, &length, NULL);
    g_print("before set:\n%s\n", contents);
    g_free(contents);
    key_file = g_key_file_new ();
    if(NULL == key_file) {
        g_print("key file new failed! \n");
    }
    ret = g_key_file_load_from_file(key_file, TEST_KEY_FILE_BASIC_FILE, 0, NULL);
    if(FALSE == ret) {
        g_print("key file load failed \n");
        return -1;
    }
    /* set value */
    g_print("******************** \n");
    g_print("set value \n");
    g_key_file_set_value(key_file, "Another Group", "New Item", "abcdefg");
    /* set group */
    g_print("******************** \n");
    g_print("set group and bool list \n");
    g_key_file_set_boolean_list(key_file, "New Group", "Bools", bools, 2);
    /* remove key */
    g_print("******************** \n");
    g_print("remove key \n");
    ret = g_key_file_remove_key(key_file, "Third Group", "AAA", NULL);
    g_print("remove key %s \n", ret?"Success":"Failed");
    /* remove group */
    g_print("******************** \n");
    g_print("remove group \n");
    ret = g_key_file_remove_group(key_file, "Fourth Group", NULL);
    g_print("remove group %s \n", ret?"Success":"Failed");
    
    g_key_file_save_to_file(key_file, TEST_KEY_FILE_BASIC_FILE, NULL);
    g_key_file_free(key_file);
    g_file_get_contents(TEST_KEY_FILE_BASIC_FILE, &contents, &length, NULL);
    g_print("after set and remove:\n%s\n", contents);
    g_free(contents);
    return 0;
}

运行结果:

[root@centos7_6 glib_keyfile_remove]# ./glib_keyfile_remove
before set:
# this is just an example
# there can be comments before the first group

[First Group]

Name=Key File Example\tthis value shows\nescaping

[Another Group]

Numbers=2;20;-200;0

Booleans=true;false;true;true

[Third Group]

AAA=100

BBB=true;false;true;true

[Fourth Group]

DeleteMe=abcdefg

DeleteThem=100;200;300;400
********************
set value
********************
set group and bool list
********************
remove key
remove key Success
********************
remove group
remove group Success
after set and remove:
[First Group]
Name=Key File Example\tthis value shows\nescaping

[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true
New Item=abcdefg

[Third Group]
BBB=true;false;true;true

[New Group]
Bools=true;false;

专题

key-value文件和ini文件的区别
  • ini文件使用’;‘字符作为注释行的开始,而key-value文件使用’#'字符作为注释行的开始
  • key-value文件不允许未分组的键值
  • key-value文件的编码方式是UTF-8
  • key-value文件的组名和键名区分大小写,如[GROUP]和[group]是两个不同的组
  • ini文件没有强类型的bool条目类型,只有GetProfileInt()。key-value文件中,布尔类型只能是小写的true或false

一个key-value文件的官方例子如下:

# this is just an example
# there can be comments before the first group

[First Group]

Name=Key File Example\tthis value shows\nescaping

# localized strings are stored in multiple key-value pairs
Welcome=Hello
Welcome[de]=Hallo
Welcome[fr_FR]=Bonjour
Welcome[it]=Ciao
Welcome[be@latin]=Hello

[Another Group]

Numbers=2;20;-200;0

Booleans=true;false;true;true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值