如何修改 C 中现有的 YAML 节点?
How to modify an existing YAML node in C?
我不是 C 程序员,但最近对它产生了兴趣。我正在尝试使用 C libyaml 库修改 YAML 文件的节点。当我尝试从事件标量数据修改节点时,编译器没有抱怨,但出现分段错误。
while (!done)
{
/* Get the next token. */
if (!yaml_parser_parse(&parser, &event))
goto parser_error;
//yaml_parser_scan(&parser, &token);
/* Check if this is the stream end. */
if(beginServerNodes && event.type == 8) {
beginServerNodes = 0;
}
if (event.type == YAML_SCALAR_EVENT) {
if(beginServerNodes == 1) {
//I WANT TO MODIFY THIS VALUE
printf("%s\n", event.data.scalar.value);
}
if(strcmp("servers",event.data.scalar.value) == 0) {
beginServerNodes = 1;
}
}
if (event.type == YAML_STREAM_END_EVENT) {
done = 1;
}
/* Emit the token. */
if (!yaml_emitter_emit(&emitter, &event))
goto emitter_error;
}
所以当我在那个循环中尝试修改以下值时
event.data.scalar.value
必须是yaml_char_t
类型
yaml_char_t *newHost = "10.132.16.48:6379:1 redis-001";
event.data.scalar.value = newHost;
event.data.scalar.length = sizeof(newHost);
编译器没有抱怨,代码 运行 因分段错误而死。如果看过 libyaml 测试目录中的示例,但就简单地编辑节点而言,没有什么是直观的,至少对像我这样的 C 新手来说是这样。
Libyaml 期望可以通过 free()
删除每个标量的值。所以你需要用malloc()
ed内存初始化这个值:
const char* newHost = "10.132.16.48:6379:1 redis-001";
event.data.scalar.value = (yaml_char_t*)strdup(newHost);
event.data.scalar.length = strlen(newHost);
我不是 C 程序员,但最近对它产生了兴趣。我正在尝试使用 C libyaml 库修改 YAML 文件的节点。当我尝试从事件标量数据修改节点时,编译器没有抱怨,但出现分段错误。
while (!done)
{
/* Get the next token. */
if (!yaml_parser_parse(&parser, &event))
goto parser_error;
//yaml_parser_scan(&parser, &token);
/* Check if this is the stream end. */
if(beginServerNodes && event.type == 8) {
beginServerNodes = 0;
}
if (event.type == YAML_SCALAR_EVENT) {
if(beginServerNodes == 1) {
//I WANT TO MODIFY THIS VALUE
printf("%s\n", event.data.scalar.value);
}
if(strcmp("servers",event.data.scalar.value) == 0) {
beginServerNodes = 1;
}
}
if (event.type == YAML_STREAM_END_EVENT) {
done = 1;
}
/* Emit the token. */
if (!yaml_emitter_emit(&emitter, &event))
goto emitter_error;
}
所以当我在那个循环中尝试修改以下值时
event.data.scalar.value
必须是yaml_char_t
yaml_char_t *newHost = "10.132.16.48:6379:1 redis-001";
event.data.scalar.value = newHost;
event.data.scalar.length = sizeof(newHost);
编译器没有抱怨,代码 运行 因分段错误而死。如果看过 libyaml 测试目录中的示例,但就简单地编辑节点而言,没有什么是直观的,至少对像我这样的 C 新手来说是这样。
Libyaml 期望可以通过 free()
删除每个标量的值。所以你需要用malloc()
ed内存初始化这个值:
const char* newHost = "10.132.16.48:6379:1 redis-001";
event.data.scalar.value = (yaml_char_t*)strdup(newHost);
event.data.scalar.length = strlen(newHost);