我不明白 inih 是如何工作的
I don't understand how inih works
几个小时以来,我一直在尝试使用 inih lib 读取 ini 文件,但我仍然不完全理解这段代码,尤其是 configuration* pconfig = (configuration*)user;
,处理函数的参数是什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../ini.h"
typedef struct
{
int version;
const char* name;
const char* email;
} configuration;
static int handler(void* user, const char* section, const char* name,
const char* value)
{
configuration* pconfig = (configuration*)user;
#define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0
if (MATCH("protocol", "version")) {
pconfig->version = atoi(value);
} else if (MATCH("user", "name")) {
pconfig->name = strdup(value);
} else if (MATCH("user", "email")) {
pconfig->email = strdup(value);
} else {
return 0; /* unknown section/name, error */
}
return 1;
}
int main(int argc, char* argv[])
{
configuration config;
if (ini_parse("test.ini", handler, &config) < 0) {
printf("Can't load 'test.ini'\n");
return 1;
}
printf("Config loaded from 'test.ini': version=%d, name=%s, email=%s\n",
config.version, config.name, config.email);
return 0;
}
user
是“通用指针”或“无类型指针”。
取消引用该指针会给你一个 void
类型的值,这是不可能的。
因此您必须将指针转换为正确的类型才能使用它。
至于参数及其用途,您可以read the source。
但是稍微了解一下INI files应该很容易推断出section
参数是文件中一个节的名称,而name
是当前值名称,value
是值本身。
所以假设一个部分和值像
[foo]
bar = something
那么section
就是"foo"
,name
就是"bar"
,value
就是"something"
。
而user
参数很可能是传递给ini_parse
的第三个参数。
user
显然是指向 configuration
你给 ini_parse
实例的指针。
void*
只是 C 中可用的指针类型擦除。
section
是 .ini 文件部分的名称,
name
是键名,value
是键的值。
ini_parse
为每个键调用处理程序,传递它 configuration
和解析迭代的结果。处理程序如何处理该信息,将由库的用户定义。
几个小时以来,我一直在尝试使用 inih lib 读取 ini 文件,但我仍然不完全理解这段代码,尤其是 configuration* pconfig = (configuration*)user;
,处理函数的参数是什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../ini.h"
typedef struct
{
int version;
const char* name;
const char* email;
} configuration;
static int handler(void* user, const char* section, const char* name,
const char* value)
{
configuration* pconfig = (configuration*)user;
#define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0
if (MATCH("protocol", "version")) {
pconfig->version = atoi(value);
} else if (MATCH("user", "name")) {
pconfig->name = strdup(value);
} else if (MATCH("user", "email")) {
pconfig->email = strdup(value);
} else {
return 0; /* unknown section/name, error */
}
return 1;
}
int main(int argc, char* argv[])
{
configuration config;
if (ini_parse("test.ini", handler, &config) < 0) {
printf("Can't load 'test.ini'\n");
return 1;
}
printf("Config loaded from 'test.ini': version=%d, name=%s, email=%s\n",
config.version, config.name, config.email);
return 0;
}
user
是“通用指针”或“无类型指针”。
取消引用该指针会给你一个 void
类型的值,这是不可能的。
因此您必须将指针转换为正确的类型才能使用它。
至于参数及其用途,您可以read the source。
但是稍微了解一下INI files应该很容易推断出section
参数是文件中一个节的名称,而name
是当前值名称,value
是值本身。
所以假设一个部分和值像
[foo]
bar = something
那么section
就是"foo"
,name
就是"bar"
,value
就是"something"
。
而user
参数很可能是传递给ini_parse
的第三个参数。
user
显然是指向 configuration
你给 ini_parse
实例的指针。
void*
只是 C 中可用的指针类型擦除。
section
是 .ini 文件部分的名称,
name
是键名,value
是键的值。
ini_parse
为每个键调用处理程序,传递它 configuration
和解析迭代的结果。处理程序如何处理该信息,将由库的用户定义。