Directory_iterator - Сделайте копию на «Перемотка»?
-
29-10-2019 - |
Вопрос
Так что я написал небольшую программу, чтобы попробовать повысить файловую систему. Моя программа напишет, сколько файлов есть в текущем пути, а затем имена файлов. Вот моя программа:
#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;
}
.
Файлы, существующие программа .exe, .ilk и .pdb
Однако я получаю следующий вывод (весь путь оставлен для краткости):
$ program.exe
Общее количество файлов: 3
[..] / program.pdb
Ошибка утверждения: m_imp-> m_handle!= 0 && "Внутренняя программа Ошибка", Файл C: \ Program Files \ Boost \ Boost_1_44 \ Boost \ FileSystem \ v2 \ options.hpp, строка 1001Если я сделаю новый Directory_iterator вместо этого работает нормально:
.di = start; // .. becomes .. di = directory_iterator(current_path());
Я заметил a Подобный вопрос Я понятия не имею, что они ссылаются или если это та же проблема.
Вопрос: Почему я не могу сохранить устаревку, а затем использовать это, чтобы перемотать свой итератор?
Решение
Это та же проблема.
Итератор каталога - это один перевал итератор.Вы не можете сохранить копию и пройти второй проход.Каждый раз, когда вы увеличиваете итератор, вы получаете следующую запись, но вы не можете уменьшить его, и вы не можете вернуться назад и начать все, даже если вы сохранили копию отправной точки.
Если вы хотите пройти дважды, вам нужно создать другой итератор (и риск того, что количество файлов изменилось).