directory_iterator — сделать копию для перемотки?

Поэтому я написал небольшую программу, чтобы попробовать 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

#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;
}
44\boost\filesystem\v2\operations.hpp, строка 1001

Если вместо этого я создам новый directory_iterator, он будет работать нормально:

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

Я заметил похожий вопрос, связанный с directory_iterators, но у меня нет идея, что они имеют в виду, или если это та же проблема.

Вопрос: почему я не могу сохранить startiterator, а затем использовать его для перемотки моего итератора?


person Default    schedule 18.06.2011    source источник
comment
Ответ на другой вопрос уже говорит нам, в чем проблема - итератор каталога является итератором с одним проходом. Вы не можете сохранить копию и пройти второй проход.   -  person Bo Persson    schedule 18.06.2011
comment
возможный дубликат , как сделать копию boost::filesystem::directory_iterator ?   -  person Bo Persson    schedule 18.06.2011
comment
Что вы не можете использовать копию. Если вы хотите пройти дважды, вам нужно создать два итератора (и риск того, что количество файлов изменилось).   -  person Bo Persson    schedule 18.06.2011


Ответы (1)


Это та же проблема.

Итератор каталога — это итератор с одним проходом. Вы не можете сохранить копию и пройти второй проход. Каждый раз, когда вы увеличиваете итератор, вы получаете следующую запись, но вы не можете уменьшить ее, и вы не можете вернуться и начать все сначала, даже если вы сохранили копию начальной точки.

Если вы хотите пройти дважды, вам нужно создать еще один итератор (и риск того, что количество файлов изменилось).

person Bo Persson    schedule 04.07.2011