Semplice glob in C ++ su unix system?

Voglio recuperare tutti i percorsi corrispondenti seguendo questo modello in un vector :

 "/some/path/img*.png" 

Come posso farlo semplicemente?

Ce l’ho nel mio succo. Ho creato un wrapper stl su glob in modo che restituisca il vettore di stringa e si occupi di liberare il risultato glob. Non esattamente molto efficiente ma questo codice è un po ‘più leggibile e alcuni direbbero più facile da usare.

 #include  // glob(), globfree() #include  // memset() #include  #include  #include  #include  std::vector glob(const std::string& pattern) { using namespace std; // glob struct resides on the stack glob_t glob_result; memset(&glob_result, 0, sizeof(glob_result)); // do the glob operation int return_value = glob(pattern.c_str(), GLOB_TILDE, NULL, &glob_result); if(return_value != 0) { globfree(&glob_result); stringstream ss; ss << "glob() failed with return_value " << return_value << endl; throw std::runtime_error(ss.str()); } // collect all the filenames into a std::list vector filenames; for(size_t i = 0; i < glob_result.gl_pathc; ++i) { filenames.push_back(string(glob_result.gl_pathv[i])); } // cleanup globfree(&glob_result); // done return filenames; } 

È ansible utilizzare la funzione di libreria POSIX glob() .

Ho scritto una semplice libreria glob per Windows e Linux (probabilmente funziona anche su altri * nix) qualche tempo fa, quando ero annoiato, sentitevi liberi di usarlo come volete.

Esempio di utilizzo:

 #include  #include "glob.h" int main(int argc, char **argv) { glob::Glob glob(argv[1]); while (glob) { std::cout << glob.GetFileName() << std::endl; glob.Next(); } } 

Ho provato le soluzioni sopra su Centos6 e ho scoperto che dovevo cambiare:

 int ret = glob(pat.c_str(), 0, globerr, &glob_result); 

(dove “globerr” è una funzione di gestione degli errori)

Senza l’esplicito 0, ho ricevuto l’errore “GLOB_NOSPACE”.

Molto probabilmente http://www.boost.org/doc/libs/release/libs/regex/ è il più vicino che si ottiene. C’è una buona probabilità che questo sarà supportato in C ++ 11.