Question

J'ai donc écrit un petit programme pour essayer Boost Système de fichiers. Mon programme écrit le nombre de fichiers dans le chemin d'accès actuel, puis les noms de fichiers. Voici mon programme:

#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;
}

Les fichiers existants sont programme.exe, .ilk et .pdb
Cependant, j'obtiens la sortie suivante (chemin entier laissé de côté pour la concision):

$ programme.exe
Nombre total de fichiers: 3
..] / programme.pdb
Échec de l'affirmation: m_imp-> m_handle! = 0 && "Erreur du programme interne", fichier C: Program Files boost boost_1_44 boost filesystem v2 operations.hpp, ligne 1001

Si je fais un nouveau Directory_iterator à la place, cela fonctionne bien:

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

J'ai remarqué un question similaire Lié à Directory_Iterators, mais je n'ai aucune idée de ce à quoi ils font référence ou si c'est le même problème.

La question est: pourquoi ne puis-je pas enregistrer un startiterator et ensuite l'utiliser pour rembobiner mon itérateur?

Était-ce utile?

La solution

C'est le même problème.

L'itérateur du répertoire est un itérateur One Pass. Vous ne pouvez pas enregistrer une copie et faire une deuxième passe. Chaque fois que vous incrémentez l'itérateur, vous obtenez la prochaine entrée, mais vous ne pouvez pas la diminuer et vous ne pouvez pas revenir en arrière et recommencer, pas même si vous avez enregistré une copie du point de départ.

Si vous souhaitez traverser deux fois, vous devez créer un autre itérateur (et risquer que le nombre de fichiers ait changé).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top