1

ID3 フレームが 1 つしかない mp3 ファイルのインデックスを作成しようとしています。CLucene と TagLib を使用します。次のコードは正常に機能します。

...
TagLib::MPEG::File file("/home/user/Depeche Mode - Personal Jesus.mp3");
if (file.ID3v2Tag()) {
    TagLib::ID3v2::FrameList frameList = file.ID3v2Tag()->frameList();
    lucene::document::Document *document = new lucene::document::Document;
    TagLib::ID3v2::FrameList::ConstIterator frame = frameList.begin();
    std::wstring field_name((*frame)->frameID().begin(), (*frame)->frameID().end());
    const wchar_t *fieldName = field_name.c_str();
    const wchar_t *fieldValue = (*frame)->toString().toWString().c_str();
    lucene::document::Field field(fieldName, fieldValue, true, true, true, false);
    document->add(field);
    writer->addDocument(document);
}
...

しかし、これはアプリケーションをクラッシュさせます:

...
TagLib::MPEG::File file("/home/user/Depeche Mode - Personal Jesus.mp3");
if (file.ID3v2Tag()) {
    TagLib::ID3v2::FrameList frameList = file.ID3v2Tag()->frameList();
    lucene::document::Document *document = new lucene::document::Document;
    for (TagLib::ID3v2::FrameList::ConstIterator frame = frameList.begin(); frame != frameList.end(); frame++) {
            std::wstring field_name((*frame)->frameID().begin(), (*frame)->frameID().end());
            const wchar_t *fieldName = field_name.c_str();
            const wchar_t *fieldValue = (*frame)->toString().toWString().c_str();
            lucene::document::Field field(fieldName, fieldValue, true, true, true, false);
            document->add(field);
    }
    writer->addDocument(document);
}
...

何故ですか?!

4

2 に答える 2

2

これはスコープの問題です。writer->addDocumentを呼び出すまでに、追加したフィールドは解放されます。代わりに次のコードを使用してください。

document->add(* new lucene::document::Field(fieldName, fieldValue, true, true, true, false));

cl_demoとcl_testを見て、いくつかのコードサンプルを確認することをお勧めします。

于 2010-07-01T15:06:11.700 に答える
0

追加するタグごとに新しい lucene::document::Field を作成する必要はありませんか? これには同じアドレスを再利用しているように見えますが、これは問題です。デバッガーがもっと教えてくれると思います。

于 2010-07-01T13:40:51.903 に答える