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.