gpt4 book ai didi

yaml-cpp - 使用 YAML-CPP 发布解析文件

转载 作者:行者123 更新时间:2023-11-28 08:23:44 27 4
gpt4 key购买 nike

在下面的代码中,我在使用 parser.GetNextDocument(doc); 解析我的 .yaml 文件时遇到了一些问题。经过大量调试后,我发现这里的(主要)问题是我的 for 循环没有运行,因为 doc.size() == 0; 我做错了什么?

void
BookView::load()
{
aBook.clear();

QString fileName =
QFileDialog::getOpenFileName(this, tr("Load Address Book"),
"", tr("Address Book (*.yaml);;All Files (*)"));
if(fileName.isEmpty())
{
return;
}
else
{
try
{
std::ifstream fin(fileName.toStdString().c_str());
YAML::Parser parser(fin);
YAML::Node doc;
std::map< std::string, std::string > entry;

parser.GetNextDocument(doc);
std::cout << doc.size();

for( YAML::Iterator it = doc.begin(); it != doc.end(); it++ )
{
*it >> entry;
aBook.push_back(entry);
}

}
catch(YAML::ParserException &e)
{
std::cout << "YAML Exception caught: "
<< e.what()
<< std::endl;
}
}
updateLayout( Navigating );
}

正在读取的 .yaml 文件是使用 yaml-cpp 生成的,所以我假设它是正确形成的 YAML,但为了以防万一,这里还是文件。

^@^@^@\230---
-
address: ******************
comment: None.
email: andrew(dot)levenson(at)gmail(dot)com
name: Andrew Levenson
phone: **********^@

编辑:根据要求,发射代码:

void
BookView::save()
{
QString fileName =
QFileDialog::getSaveFileName(this, tr("Save Address Book"), "",
tr("Address Book (*.yaml);;All Files (*)"));
if (fileName.isEmpty())
{
return;
}
else
{
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly))
{
QMessageBox::information(this, tr("Unable to open file"),
file.errorString());
return;
}

std::vector< std::map< std::string, std::string > >::iterator itr;
std::map< std::string, std::string >::iterator mItr;
YAML::Emitter yaml;

yaml << YAML::BeginSeq;
for( itr = aBook.begin(); itr < aBook.end(); itr++ )
{
yaml << YAML::BeginMap;
for( mItr = (*itr).begin(); mItr != (*itr).end(); mItr++ )
{
yaml << YAML::Key << (*mItr).first << YAML::Value << (*mItr).second;
}
yaml << YAML::EndMap;
}
yaml << YAML::EndSeq;

QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_5);
out << yaml.c_str();
}
}

最佳答案

按照您的想法,问题在于您正在使用 QDataStream 编写,但使用普通 std::ifstream 进行读取。您需要做其中之一。

如果你想使用QDataStream,你也需要读入它。查看doc有关更多详细信息,但看起来您只需获取 YAML 字符串即可:

QDataStream in(&file);
QString str;
in >> str;

然后传递给yaml-cpp:

std::stringstream stream; // remember to include <sstream>
stream << str; // or str.toStdString() - I'm not sure about how QString works
YAML::Parser parser(stream);
// etc.

std::stringstream 的作用是将包含 YAML 的字符串转换为 YAML 解析器可以读取的流。

关于yaml-cpp - 使用 YAML-CPP 发布解析文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4868204/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com