2

クラスrecursive_directory_iteratorのおかげで、新しいブーストv1.5.3を使用して、次のようなこのタスクを実行しています(再帰コードを記述する必要はありません)。

void ListDirRec(const char *Dir, vector<string>& DirFileList, const char* ext)
{    
recursive_directory_iterator rdi(Dir);  
recursive_directory_iterator end_rdi;

DirFileList.empty();

string ext_str0(ext);   
for (; rdi != end_rdi; rdi++)
{
    rdi++;
    //cout << (*di).path().string() << endl;
    cout << (*rdi).path().string() << endl;

    //cout << " <----- " << (*rdi).path().extension() << endl;

    //string ext_str1 = (*rdi).path().extension().string();
    if (ext_str0.compare((*rdi).path().extension().string()) == 0)
    {
        DirFileList.push_back((*rdi).path().string());
    }
}

特定の拡張子を持つ関数リストファイル。この関数はケースで機能しますが、次のような「アサーション失敗エラー」を頻繁に返します。

**** Internal program error - .... assertion (m_imp.get()) ... operations.hpp(952): dereference of end recursive_directory_iterator

このエラーの原因はほとんどわかりません。何か試してみることができますか..助けをキャッチしますか?助けてくれてありがとう

4

2 に答える 2

5

rdiループ内とfor宣言内でインクリメントしています。

for (; rdi != end_rdi; rdi++)
{
    rdi++;

つまり、ループ内に (最後の要素の後ろを意味する終了イテレータ) があるrdi可能性があります。end_rdiあなたがこれをしている理由はありますか?rdi != end_rdi(これが意図的なものである場合は、インクリメントした後に再度確認する必要があります。)

于 2013-03-03T06:42:59.367 に答える
2

次のようなことを試すことができます:

recursive_directory_iterator dir(path(Dir));
for(auto&& i : dir) {
    if (is_directory(i)) {
        //Do whatever you want
        cout << i << endl;
    }
}
于 2016-07-01T19:10:20.300 に答える