directory_iterator - сделать копию для «перемотки»? - PullRequest
3 голосов
/ 18 июня 2011

Итак, я написал небольшую программу, чтобы опробовать 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: \программные файлы \ boost \ boost_1_44 \ boost \ filesystem \ v2 \ operations.hpp, строка 1001

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

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

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

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

1 Ответ

0 голосов
/ 04 июля 2011

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

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

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

...