txt leer guardar directorios datos archivos archivo c++ boost boost-filesystem boost-foreach

c++ - leer - Iterar sobre todos los archivos en un directorio usando BOOST_FOREACH



guardar y leer datos en un archivo.txt en c++ (3)

Su dirPath no es una secuencia, su secuencia es del tamaño 1.

http://www.boost.org/doc/libs/1_48_0/doc/html/foreach.html

BOOST_FOREACH itera sobre secuencias. Pero, ¿qué califica como una secuencia, exactamente? Como BOOST_FOREACH está construido sobre Boost.Range, admite automáticamente aquellos tipos que Boost.Range reconoce como secuencias. Específicamente, BOOST_FOREACH funciona con tipos que satisfacen el concepto de rango de pase único. Por ejemplo, podemos usar BOOST_FOREACH con:

  • Contenedores STL
  • matrices
  • Cadenas terminadas en nulo (char y wchar_t)
  • std :: par de iteradores

Nota
El soporte para contenedores STL es muy general; todo lo que se parece a un contenedor STL cuenta. Si ha anidado los tipos de iterador y const_iterator y las funciones de miembro begin () y end (), BOOST_FOREACH sabrá automáticamente cómo iterar sobre él. Es de esta manera que boost :: iterator_range <> y boost :: sub_range <> trabajan con BOOST_FOREACH.

¿Puede iterar sobre todos los archivos en un directorio usando boost :: filesystem y BOOST_FOREACH? Lo intenté

path dirPath = ... int fileCount = 0; BOOST_FOREACH(const path& filePath, dirPath) if(is_regular_file(filePath)) ++fileCount;

Este código compila, ejecuta, pero no produce el resultado deseado.


Puede iterar sobre archivos en un directorio usando BOOST_FOREACH siguiente manera:

#include <boost/filesystem.hpp> #include <boost/foreach.hpp> namespace fs = boost::filesystem; fs::path targetDir("/tmp"); fs::directory_iterator it(targetDir), eod; BOOST_FOREACH(fs::path const &p, std::make_pair(it, eod)) { if(fs::is_regular_file(p)) { // do something with p } }


Así que supuse que me había perdido el bote en este caso, pero estaba teniendo un problema similar incluso después de encontrar el código que teóricamente debería funcionar. El problema es el tipo de datos boost :: filesystem :: path toma el último carácter de una cadena.

Estaba leyendo un archivo y mi ruta era "c: / one / two / three". Pero cuando lo convertí en un tipo de datos de ruta, la cadena se cambió a "c: / one / two / thre". No tengo idea de qué es eso, pero debido a esto no se encontró la ubicación del archivo y bla, bla, bla. Lo que hice para arreglarlo fue simplemente agregar otro ''/' hasta el final. De esa forma elimina el ''/' en lugar de la ''e''.

funcionó bien después de eso. Pero como dije antes, no tengo idea de por qué lo hizo. Espero que esto ayude a alguien.