如何在yaml cpp中保留插入顺序
Posted
技术标签:
【中文标题】如何在yaml cpp中保留插入顺序【英文标题】:How to preserve inserting order in yaml cpp 【发布时间】:2014-05-08 11:22:02 【问题描述】:我创建了一个 yamlmap,其中包含 keys 和 values 作为字符串,我已将其保存到文本文件中。在加载相同的文本文件时,包含字符串的键由yaml自动排序。现在我想以与我保存的顺序相同的顺序加载字符串名称。为了解决这个问题,我必须在函数 saveSettings() 和 loadSettings 中做些什么。谢谢
std::vector<SettingsPair*> settingsvector;std::list<std::string> settings_list;
class SettingsPair
public:
/**
* @brief standard constructor
*/
SettingsPair();
SettingsPair(QLineEdit *le, QLabel *la);
~SettingsPair();
QLineEdit* line_edit;
QLabel* label;
;
void task1::saveSettings()
QString filename = QFileDialog::getSaveFileName(this,
tr("save YAML File "),"C:/Users/marthala/Desktop/ws/settingstask","ALL files(*.*);;YAML File(*.yaml)");
std::ofstream ofstr;
std::string file= filename.toStdString();
YAML::Emitter out;
ofstr.open(file.c_str());
out << YAML::BeginMap;
for(std::vector<SettingsPair*>::iterator list_iter = settingsvector.begin();
list_iter != settingsvector.end(); list_iter++)
QString key_lineedit = (*list_iter)->line_edit->text();
QString key_label = (*list_iter)->label->text();
out << YAML::Key << key_label.toStdString();
out << YAML::Value <<key_lineedit.toStdString();
ofstr<<out.c_str();
out << YAML::EndMap;
std::cout<<"here is the output while saving the file:\n"<<out.c_str() ;
ofstr.close();
void task1::loadSettings()
QString filename = QFileDialog::getOpenFileName(this,
tr("Open File"),"C:/Users/marthala/Desktop/ws/settingstask","ALL files(*.*);;YAML File(*.yaml)");
//getOpenFileName will retuns the file path of the file selected
if(filename.isEmpty())
return;
else
try
std::ifstream fin(filename.toStdString().c_str());
YAML::Parser parser(fin);
YAML::Node doc;
while(parser.GetNextDocument(doc))
std::vector<SettingsPair*>::iterator list_iter = settingsvector.begin();
if(list_iter != settingsvector.end())
std::string key_, value_;
for(YAML::Iterator it=doc.begin();it!=doc.end();++it)
it.first() >> key_;
it.second() >> value_;
QString str1 = QString::fromUtf8(key_.c_str());
QString str2 = QString::fromUtf8(value_.c_str());
(*list_iter)->label->setText(str1);
(*list_iter)->line_edit->setText(str2);
list_iter++;
std::cout<<"here is the output while loading the file:\n"<< key_<<":\n"<<value_;
catch(YAML::ParserException &e)
std::cout<<"YAML Exception caught"<<e.what()<<std::endl;
【问题讨论】:
【参考方案1】:目前正在考虑此功能。详情请查看项目页面issue report。
【讨论】:
现在我们可以做点什么来解决这个问题吗?我创建了一个具有多个映射的序列。我可以保存它 yamlfile 文件无法加载?如何解析具有多个映射的序列?一个想法? 我不确定我是否遵循 - 我认为您的问题是关于以非指定顺序迭代的地图。你有不同的问题吗?如果是这样,请提出一个单独的问题。 实际上你所理解的是正确的,地图正在按 Aplabetical 顺序迭代,而不保留原始顺序。【参考方案2】:您需要 yaml-cpp 0.6 或更高版本
https://github.com/jbeder/yaml-cpp/commit/f0b15cd6a0d61f5b2dbc317263c02f91a7e3692c
【讨论】:
以上是关于如何在yaml cpp中保留插入顺序的主要内容,如果未能解决你的问题,请参考以下文章