使用 YAML-CPP 发出解析文件
Posted
技术标签:
【中文标题】使用 YAML-CPP 发出解析文件【英文标题】:Issue Parsing File with YAML-CPP 【发布时间】:2011-02-01 21:34:16 【问题描述】:在以下代码中,我在使用 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();
【问题讨论】:
启动文件的^@^@^@\230
是什么? (以及结束它的^@
?)如果yaml-cpp
真的发出了那个,你能发布你的发射代码吗?
我不知道那是什么,所以我放了发射代码。可能和设置Qt版本有关?
【参考方案1】:
按照您的想法,问题是您正在使用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 解析器可以读取的流。
【讨论】:
杰西,还是什么都没有。我对其进行了修改,现在它看起来像这样:codepad.org/zBWsUU7L,在我的测试中,它看起来像str
是空的。
@Andrew,你能确定你可以写一个字符串然后用QDataStream
读回来吗?
我从使用 QDataStream 切换到 std::ofstream,它似乎工作正常。以上是关于使用 YAML-CPP 发出解析文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 yaml-cpp 解析 YAML !!timestamp(日期时间)
尝试使用 yaml-cpp 解析 OpenCV YAML 输出