directory_iterator - faça uma cópia de "retrocesso"?
-
29-10-2019 - |
Pergunta
Então, eu escrevi um pequeno programa para tentar Impulsionar sistema de arquivos.Meu programa vai escrever quantos arquivos há no caminho actual e, em seguida, os nomes de arquivo.Aqui está o meu 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;
}
arquivos existentes são program.exe, .laia e .pdb
No entanto tenho a seguinte saída (todo o caminho deixado de fora por questões de brevidade):
$ program.exe
número total de arquivos:3
[..]/programa.pdb
Falha de asserção:m_imp->m_handle != 0 && "erro interno do programa", arquivo c:\program files\boost\boost_1_44\boost\filesystem\v2\operações.a uhe, linha 1001
Se eu fizer um novo directory_iterator em vez disso, ele funciona muito bem:
di = start;
// .. becomes ..
di = directory_iterator(current_path());
Eu notei uma semelhante pergunta relacionados para directory_iterators mas eu não tenho nenhuma idéia do que eles estão se referindo a ou se é o mesmo problema.
A pergunta é:Por que não consigo salvar um startiterator e, em seguida, usar isso para retroceder meu iterador?
Solução
É o mesmo problema.
O diretório iterador é um passar iterador.Você não pode salvar uma cópia e dar um segundo passo.A cada vez que você incrementar o iterador você obtenha a seguinte entrada, mas você pode diminuir e você não pode voltar e recomeçar, nem mesmo se você salvou uma cópia do ponto de partida.
Se você quiser atravessar duas vezes, você precisa criar outro iterador (e o risco de que o número de arquivos foi alterado).