4

そこで、Boost Filesystem を試すための小さなプログラムを作成しました。私のプログラムは、現在のパスにあるファイルの数とファイル名を書き込みます。これが私のプログラムです:

#include <iostream>
#include <boost/filesystem.hpp>

using namespace boost::filesystem;

int main(){
    directory_iterator start = directory_iterator(current_path());
    directory_iterator di = start;
    int count;
    for (count = 0; di != directory_iterator(); ++di, ++count);
    std::cout << std::endl << "total number of files: " << count << std::endl;
    di = start;
    for (; di != directory_iterator(); ++di){
        std::cout << *di << std::endl;
    }
    return 0;
}

存在するファイルは、program.exe、.ilk、および .pdb
ですが、次の出力が得られます (簡潔にするためにパス全体を省略しています)。

$ program.exe
ファイルの総数: 3
[..]/program.pdb
アサーションに失敗しました: m_imp->m_handle != 0 && 「内部プログラム エラー」、ファイル c:\program files\boost\boost_1_44\boost\filesystem\ v2\operations.hpp、1001 行目

代わりに新しい directory_iterator を実行すると、正常に動作します。

di = start;
// .. becomes ..
di = directory_iterator(current_path());

directory_iterators に関連する同様の質問に気付きましたが、それらが何を参照しているのか、それとも同じ問題なのかわかりません。

質問: startiterator を保存して、それを使用して iterator を巻き戻すことができないのはなぜですか?

4

1 に答える 1

1

同じ問題です。

ディレクトリイテレータはワンパスイテレータです。コピーを保存して2回目のパスに進むことはできません。イテレータをインクリメントするたびに次のエントリを取得しますが、開始点のコピーを保存した場合でも、それをデクリメントしたり、戻って最初からやり直したりすることはできません。

2回トラバースする場合は、別のイテレータを作成する必要があります(ファイルの数が変更されるリスクがあります)。

于 2011-07-04T13:01:12.137 に答える