问题现象
从文件读取并解析为 YAML::Node 后,对 YAML::Node 进行修改,再写入同一文件时,修改不生效。
问题复现与测试
使用 fs.clear() 清除流状态标志后再写入,会在文件尾部追加内容,而不是覆盖原有内容。
问题原因
当对已打开的文件流进行读操作时,文件流对象会读取到 EOF(文件结束符)状态。此时流处于结束状态,无法再对文件执行其他操作,导致后续的写入操作失败。
解决方案
正确的操作步骤
- 关闭原有的文件流
- 以新模式重新打开文件:使用
std::ios::trunc | std::ios::out模式
代码示例
cpp
// 1. 读取文件
std::fstream fs("config.yaml", std::ios::in);
YAML::Node config = YAML::LoadFile("config.yaml");
fs.close();
// 2. 修改 YAML 内容
config["key"] = "new_value";
// 3. 重新打开文件并写入
fs.open("config.yaml", std::ios::trunc | std::ios::out);
fs << config;
fs.close(); 关键参数说明
std::ios::trunc:打开文件时清空原有内容,避免 YAML 格式失效std::ios::out:以输出模式打开文件