如何在yaml cpp中保持插入顺序

4

我已创建了一个包含字符串 的 yamlmap,并将其保存到文本文件中。在加载相同的文本文件时,包含字符串的键会被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;
        }
    }
}
2个回答

0

此功能目前正在考虑中。有关更多详细信息,请参见项目页面上的问题报告


现在我们能做些什么来解决这个问题吗?我已经创建了一个带有多个映射的序列。我能够将其保存为yaml文件,但无法加载它。如何解析其中包含多个映射的序列?有什么想法吗? - vishnu
我不确定我理解了 - 我认为你的问题是关于在未指定顺序下迭代地图。你有其他问题吗?如果有,请提出一个单独的问题。 - Jesse Beder
实际上,您理解的是正确的,地图是按字母顺序迭代的,而不保留原始顺序。 - vishnu


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接