C语言libyaml基于文档的解析示例。

libyaml安装说明,请参照

https://github.com/yaml/libyaml 

不过官网的示例,真是不太好找实现的样例,找了大半天,都不知道示例在搞啥,也许我不太深刻吧,果然国外人的思维和中国人不一样。

其次就是解决一个非常简单的事情,读这个配置,把参数取出来就可以了,其余的不要折腾。

 

直接上代码了。

先搞个db.yaml的文件样子

db_server: "localhost"
db_password: "test"
db_username: "abc"
national_rail_username: test
national_rail_password: wibble
languages:
  - Ruby
  - Perl
  - Python
websites:
  YAML: yaml.org
  Ruby: ruby-lang.org
  Python: python.org
  Perl: use.perl.org

main.c

#include <stdio.h>
#include <yaml.h>

typedef struct Conf {
    char* db_server;
    char* db_pass;
    char* db_user;
    char* rail_user;
    char* rail_pass;
} Conf;

Conf* readConf(char* filename) {
    FILE* fh = fopen(filename, "r");
    yaml_parser_t parser;
    yaml_token_t token;
    Conf* conf = malloc(sizeof(Conf));

    if (!yaml_parser_initialize(&parser))
        fputs("Failed to initialize parser!\n", stderr);
    if (fh == NULL)
        fputs("Failed to open file!\n", stderr);
    yaml_parser_set_input_file(&parser, fh);

    do {
        /* As this is an example, I'll just use:
         *  state = 0 = expect key
         *  state = 1 = expect value
         */
        int state = 0;
        char** datap;
        char* tk;

        yaml_parser_scan(&parser, &token);
        switch(token.type)
        {
            case YAML_KEY_TOKEN:     state = 0; break;
            case YAML_VALUE_TOKEN:   state = 1; break;
            case YAML_SCALAR_TOKEN:
                tk = token.data.scalar.value;
                if (state == 0) {
                    /* It's safe to not use strncmp as one string is a literal */
                    if (!strcmp(tk, "db_server")) {
                        datap = &conf->db_server;
                    } else if (!strcmp(tk, "db_password")) {
                        datap = &conf->db_pass;
                    } else if (!strcmp(tk, "db_username")) {
                        datap = &conf->db_user;
                    } else if (!strcmp(tk, "national_rail_username")) {
                        datap = &conf->rail_user;
                    } else if (!strcmp(tk, "national_rail_password")) {
                        datap = &conf->rail_pass;
                    } else {
                        printf("key: %s\n", tk);
                    }
                } else {
                    *datap = strdup(tk);
                }
                break;
            default: break;
        }
        if (token.type != YAML_STREAM_END_TOKEN)
            yaml_token_delete(&token);
    } while (token.type != YAML_STREAM_END_TOKEN);
    yaml_token_delete(&token);

    yaml_parser_delete(&parser);
    fclose(fh);
    return conf;
}

int main(){

    char *filename = "db.yaml";
    struct Conf *conf = readConf(filename);

    printf("%s,%s\n",conf->db_server,conf->db_user);
    return 0;
}

ok,就这样取出来就可以了。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: C语言程序设计大作业文档示例根据具体的项目要求和设计思路可以有不同的结构和内容,以下是一个可能的示例: 一、项目简介: 本项目是一个基于C语言的任务管理系统。该系统可以帮助用户记录并管理任务,提供任务的添加、删除、查询等功能,并支持任务的优先级、截止日期等属性设置。 二、项目整体设计: 1. 系统的主要功能模块:包括任务管理模块、图形界面模块、数据存储模块等。 2. 系统设计的目标:实现简单易用、功能完善的任务管理系统,并具有较好的用户界面和数据存储效率。 三、详细设计: 1. 任务管理模块的设计:具体包括任务的添加、删除、查询等功能的实现,以及任务属性的设置等。 2. 图形界面模块的设计:采用GUI(Graphic User Interface)设计,提供直观友好的用户界面,通过按钮、菜单等组件实现与用户的交互。 3. 数据存储模块的设计:采用文件存储方式,将任务数据保存到磁盘文件中,实现数据的持久化存储。 四、算法设计: 1. 任务添加算法:用户通过输入任务的相关信息,将任务添加到任务列表中,并按照优先级和截止日期排序。 2. 任务删除算法:用户可以选择任务进行删除操作,同时更新任务列表。 3. 任务查询算法:用户可以按照关键词搜索任务,系统将返回相关的任务列表。 五、测试与验证: 设计完毕后,进行系统的测试与验证,包括功能测试、性能测试等,确保系统的正确性和可靠性。 六、结论: 本项目通过C语言实现了一个简单易用、功能完善的任务管理系统,满足了用户的需求。希望在今后的开发中能进一步改进和完善该系统,提升用户体验和功能扩展性。 ### 回答2: C语言程序设计大作业文档示例是一个用于指导学生完成C语言程序设计大作业的文档。它提供了作业的要求和要求,以及学生需要完成的任务和要求。 在C语言程序设计大作业文档示例中,通常会包含以下内容: 1. 作业要求:这部分介绍了作业的目标和要求,包括需要完成的功能和功能的实现方式。例如,可以要求学生编写一个简单的学生信息管理系统,包括添加、删除、修改和显示学生信息等功能。 2. 程序结构和功能:这部分详细介绍了程序的结构和各个功能的实现细节。学生可以根据文档中提供的示例代码和说明来完成每个功能的编写。例如,可以要求学生使用结构体来存储学生的信息,并使用函数来实现各个功能。 3. 编码规范:这部分介绍了学生在编写代码时需要遵循的编码规范和最佳实践。例如,可以要求学生使用有意义的变量名、注释代码、避免使用全局变量等。 4. 测试和调试:这部分介绍了如何对完成的程序进行测试和调试。学生可以根据文档中提供的测试用例和调试方法来验证自己的程序是否正确,并对存在的问题进行修复。 5. 提交和评估:这部分说明了学生需要将完成的作业提交到何处以及评估标准和流程。学生需要按照要求将自己的代码提交到指定的平台或老师指定的地方,并按时完成评估。 通过C语言程序设计大作业文档示例,学生可以更加清晰地了解大作业的要求和目标,能够有针对性地完成每个任务,并在遵守编码规范和进行测试调试的基础上,完成作业并进行提交和评估。这样的文档示例能够帮助学生提高编程能力和解决问题的能力,同时也提供了一种规范的方式来进行大作业的管理和组织。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值