Cuál es la forma de C++ lenguaje de Perl:Glob archivo en C++
my @files = glob("file*.txt");
foreach my $file (@files) {
# process $file
}
Cuál es la forma de C++ lenguaje de Perl:Glob archivo en C++
my @files = glob("file*.txt");
foreach my $file (@files) {
# process $file
}
No hay una forma estándar de C++ para emular esto porque no hay una funcionalidad estándar de C++ para leer el contenido de un directorio. Lo que puede hacer es el uso Boost.Filesystem:
#include <boost/filesystem.hpp> // plus iostream,algorithm,string,iterator
using namespace boost::filesystem; // and std
struct pathname_of {
string operator()(const directory_entry& p) const {
return p.path().filename(); // or your creativity here
}
};
int main(int argc, char* argv[])
{
transform(directory_iterator("."), directory_iterator(),
ostream_iterator<string>(cout, "\n"),
pathname_of());
return 0;
}
Puede imitar el "pegote" usando fnmatch
. Pero deberá abrir el directorio, leer el contenido y hacer coincidir cada entrada usando fnmatch
.
No hay equivalente directo que sea AFAIK estándar.
¿Qué? ¿POSIX no es un estándar lo suficientemente bueno? –
Me llaman la vieja escuela.
f = popen("ls file*.txt", "r");
Lo llamo innecesario ... usa 'fork()' y 'exec()' junto con muchos otros para algo que solo debería tomar una llamada al sistema – dlamotte
Sólo un comentario de nit, diana diamotte, glob() ciertamente más de una llamada al sistema Hace la asignación dinámica de la memoria dentro de la estructura pglob que usted proporciona, y tiene que leer en el directorio, por lo que hay al menos dos llamadas al sistema. Pero es solo una llamada de biblioteca, y eso es lo preferido. Y dada la solución de Wayne provocará que se genere un shell que a su vez llamará glob() o similar, está claro que la solución glob() es estrictamente mejor. –
Ick. Eso no es "vieja escuela", es simplemente horrible. -1. –
La API POSIX especifica los glob()
y globfree()
funciones para esto. Vea el man page. wordexp()
y wordfree()
, también especificado por POSIX, soporte other kinds of expansions también.
Hah, no es broma ... Lo hace. ¡Gracias por publicar eso! – dlamotte
¿Hay NINGÚN ALTO impulso que no pueda hacer?!?! – DVK
@Wilhelm: Gracias. ¿Cómo compilas eso? Intenté esto pero fallí 'g ++ -I ~/.boost/include/boost-1_38 wiltell_code.cpp -o wiltell_code' – neversaint
¿Qué error obtienes? Compilador, enlazador? Asegúrese de agregar el elemento faltante include: ''. Di 'std :: for_each()' o agrega una instrucción 'using'. ¿Estás en Linux o Mac? Si estás en Linux, asegúrate de enlazar con 'boost_filesystem'. Con g ++ puedes decir '-lboost_filesystem'. Si estás en una Mac, probablemente también necesites enlazar con 'boost_system'. –
wilhelmtell