2011-02-01 21 views
0

次のコードでは、.yamlファイルの解析にparser.GetNextDocument(doc);を使用して問題が発生しています。大幅なデバッグの後、私はここで(主な)問題は、私のforループが実行されていないことであることがわかりました。doc.size() == 0;何が間違っていますか?問題YAML-CPPを使用したファイルの解析

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(); 
    }  
} 
+0

ファイルを開始する '^ @^@^@ 230'とは何ですか? (そして '^ @'はそれを終わらせますか?) 'yaml-cpp'が本当にそれを放出しているならば、放出コードも投稿できますか? –

+0

私はそれが何であるか分からないので、私は放射コードを設定します。多分Qtバージョンの設定と関係がありますか? – Andy

答えて

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パーサーが読むことができるストリームに変換します。

+0

Jesse、まだ何もありません。私はそれを今のように修正しました:http://codepad.org/zBWsUU7Lと私のテストでは、 'str'が空であるように見えます。 – Andy

+0

@Andrew、あなたは 'QDataStream'を使って文字列を書いてそれを読み戻すことができますか? –

+0

私はQDataStreamをstd :: ofstreamに切り替えると動作しているようです。 – Andy