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 1001

Si 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?

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top