Directory_iterator - ¡Haz una copia para "rebobinar"?
-
29-10-2019 - |
Pregunta
Así que escribí un pequeño programa para probar el sistema de archivos Boost. Mi programa escribirá cuántos archivos hay en la ruta actual y luego los nombres de los archivos. Aquí está mi programa:
#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;
}
Los archivos existentes son program.exe, .ilk y .pdb
Sin embargo, obtengo la siguiente salida (camino entero dejado fuera por brevedad):
$ programa.exe
Número total de archivos: 3
[..] / programa.pdb
Afirmación fallida: M_IMP-> M_HANDLE!= 0 && "Error de programa interno", archivo C: \ Archivos de programa \ Boost \ Boost_1_44 \ Boost \ Filesystem \ V2 \ Operations.HPP, Línea 1001Si hago un nuevo directorio, en su lugar funciona bien:
di = start; // .. becomes .. di = directory_iterator(current_path());
Noté una Pregunta similar relacionada con directory_iterators pero No tengo idea de lo que se refieren o si es el mismo problema.
La pregunta es: ¿Por qué no puedo guardar un Startiterator y luego usarlo para rebobinar mi iterador?
Solución
Es el mismo problema.
El iterador de directorio es un iterador de un paso.No puedes guardar una copia e ir a un segundo pase.Cada vez que incrementa el iterador, obtiene la siguiente entrada, pero no puede disminuirla y no puede regresar y comenzar a comenzar, ni siquiera si ha guardado una copia del punto de inicio.
Si desea atravesar dos veces, debe crear otro iterador (y arriesgue de que el número de archivos haya cambiado).