windows c++ (7) yaml-cpp vs2019编译

安装make

遇到__declspec(dllimport) const YAML::BadSubscript::vftable 错误,请在CMAKE时勾选YAML_BUILD_SHARED_LIBS
windows c++ (7) yaml-cpp vs2019编译_第1张图片

在编译完成,执行过程中遇错,请确认你的.yaml文件正确性。使用在线 YAML 验证工具(如 YAML Lint)。

我编译好的资源,里面包含了x86的debug和release lib和dll,X64的请自己编译。

yaml-cppgithub资源。

使用例子

#include   
#include   
#include   

//Note转string
std::string NodeToString(const YAML::Node& node) {
	std::stringstream ss;
	YAML::Emitter out;
	out << node;
	ss << out.c_str();
	return ss.str();
}

void LoadAndDealYamlFile(const std::string& filepath) {  
    try {  
        YAML::Node config = YAML::LoadFile(filepath);  
        std::cout << "YAML文件加载成功!" << std::endl;  
        
        // 处理YAML数据...  
        //获取子节点数据
        //1 直接读  as 方法下面有介绍 
        std::string strNum = config["key"]["keyChild"]["number"].as<std::string>();
       
        //2 赋节点
        YAML::Node conChild = config["key"];
        YAML::Node chiChild = config["keyChild"];
        std::string strNum2 = chiChild["number"].as<std::string>();
        
		/*******************增 begin********************/
		// 在映射中增加新的键值对  
		//对于映射,你可以通过赋值一个不存在的键来增加新的键值对。
		//对于序列,你可以使用push_back方法或索引操作符(如果索引超出当前范围,它会自动扩展序列)来增加新元素。
		config["new_key"] = "new value";  
		  
		// 在序列中增加新元素  
		if (config.IsSequence()) {  
		    config.push_back("new element"); // 使用push_back  
		    // 或者如果知道索引且不担心覆盖  
		    config[config.size()] = "another new element"; // 使用索引(不推荐,因为需要知道当前大小)  
		}
		/*******************增 begin********************/
		
		/*******************删 begin********************/
		//对于映射,你可以使用erase方法来删除键值对。
		//对于序列,你可以使用erase方法删除特定索引的元素,但注意这会改变序列中剩余元素的索引。
		// 删除映射中的键值对  
		config.erase("key_to_delete");  
		  
		// 删除序列中的元素  
		if (config.IsSequence()) {  
		    config.erase(config.begin() + index_to_delete); // 使用迭代器(需要包含
		    // 或者如果知道索引且索引有效  
		    config.erase(config.begin() + static_cast<std::ptrdiff_t>(index_to_delete)); // 注意类型转换  
		}
		/*******************删 begin********************/
		
		/*******************改 begin********************/
		//对于标量节点,直接赋值即可(但通常不会这样做,因为YAML主要用于序列化复杂数据结构)。
		//对于序列和映射节点,找到对应的元素或值后,可以使用=操作符来修改它。
		// 修改映射中的值  
		config["key"] = "new value";  
		  
		// 修改序列中的元素  
		if (config.IsSequence()) {  
		    config[0] = "new first element"; // 修改第一个元素  
		}
		/*******************改 begin********************/
		
		/*******************查 begin********************/
		//标量节点:通常不需要查找,因为它们不包含子节点。
		//序列节点:使用索引来访问元素(索引从0开始)。
		//映射节点:使用键(key)来访问值(value)。
		// 查找映射中的值  
		std::string value = config["key"].as<std::string>(); // 假设"key"对应的值是一个字符串  
		  
		// 查找序列中的元素  
		if (node.IsSequence()) {  
		    YAML::Node element = config[0]; // 访问第一个元素  
		}
		/*******************查 end********************/
		
		//Note转string
		std::string strTem = NodeToString(config);
		
		//保存config为yaml文件
	    std::ofstream fout("./test.yaml"); 
	    fout << config;
	    fout.close();
    } catch (const YAML::ParserException& e) {  
        std::cerr << "YAML解析错误: " << e.what() << std::endl;  
    } catch (const std::exception& e) {  
        std::cerr << "加载YAML文件时发生错误: " << e.what() << std::endl;  
    } catch (...) {  
        std::cerr << "未知错误: 无法加载YAML文件。" << std::endl;  
    }  
}  
  
int main() {  
    std::string filepath = "path/to/your/file.yaml";  
    LoadAndDealYamlFile(filepath);  
    return 0;  
}

as()方法

在yaml-cpp库中,YAML::Node对象的as()方法用于将节点的内容转换为指定的类型T。这个方法非常有用,因为它允许你以类型安全的方式从YAML文件中读取数据,并将其转换为C++中的相应类型。

as()方法会尝试将YAML::Node的内容转换为类型T。如果转换成功,它将返回转换后的值;如果转换失败(例如,因为节点的内容与请求的类型不匹配),它将抛出一个YAML::BadConversion异常。

以下是一些使用as()方法的示例:

示例 1: 转换为字符串

YAML::Node node = YAML::Load("[hello, world]"); // 假设这是一个序列,但我们只关心第一个元素  
std::string str = node[0].as<std::string>(); // 将序列的第一个元素转换为字符串

注意:在这个例子中,我们实际上是从一个序列中取出了第一个元素,并将其作为字符串读取。如果序列的第一个元素不是字符串,这将抛出一个异常。

示例 2: 转换为整数

YAML::Node node = YAML::Load("age: 30"); // 假设这是一个映射  
int age = node["age"].as<int>(); // 将"age"键对应的值转换为整数

示例 3: 转换为布尔值

YAML::Node node = YAML::Load("is_active: true"); // 假设这是一个映射  
bool isActive = node["is_active"].as<bool>(); // 将"is_active"键对应的值转换为布尔值

示例 4: 转换为自定义类型(需要解析函数)

如果,你想要将YAML::Node转换为自定义类型,你需要为该类型提供一个解析函数,因为yaml-cpp默认不支持直接将节点转换为自定义类型。这通常涉及到使用YAML::EmitterYAML::Parser的底层API,或者更常见的是,通过重载>>运算符(对于自定义类型)来实现。
但是,对于简单的用例,你可以直接在调用as()之前,将节点的内容转换为标准类型,然后在你的自定义类型中使用这些标准类型。

注意事项

  • 在调用as()之前,最好检查节点的类型是否与你要转换的类型兼容。虽然as()会在转换失败时抛出异常,但提前检查可以避免不必要的异常处理。
  • 如果你的YAML文件包含复杂的数据结构(如嵌套的映射和序列),你可能需要多次使用as(),或者结合使用索引操作符[]和映射键来访问嵌套的数据。
  • 对于自定义类型,考虑实现一个自定义的解析函数或重载>>运算符,以便更直接地将YAML::Node转换为你的类型。然而,这通常涉及到更多的代码和可能的复杂性。

你可能感兴趣的:(windows,c++,c++,开发语言)