2010-05-07 6 views
9

Qual è il modo C++ del linguaggio Perl:Glob file in C++

my @files = glob("file*.txt"); 
foreach my $file (@files) { 

    # process $file 
} 

risposta

7

Non esiste un modo C++ standard per emulare questo perché non esiste una funzionalità C++ standard di lettura del contenuto di una directory. Quello che puoi fare è usare 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; 
} 
+2

C'è QUALCUNO di spinta non può fare?!?! – DVK

+0

@ Wilhelm: Grazie. Come lo compili? Ho provato questo, ma ho fallito 'g ++ -I ~/.boost/include/boost-1_38 wiltell_code.cpp -o wiltell_code' – neversaint

+2

Che errore ottieni? Compilatore, linker? Assicurati di aggiungere l'inclusione mancante: "". Pronuncia 'std :: for_each()' o aggiungi un'istruzione 'using'. Sei su Linux o Mac? Se sei su Linux assicurati di collegarti a 'boost_filesystem'. Con g ++ puoi dire '-lboost_filesystem'. Se sei su un Mac probabilmente devi anche collegarti a 'boost_system'. – wilhelmtell

0

È possibile imitare la "glob" utilizzando fnmatch. Ma dovrai aprire la directory, leggere i contenuti e abbinare ogni voce usando fnmatch.

Nessun equivalente diretto che è AFAIK standard.

+1

Cosa? POSIX non è uno standard abbastanza buono? –

-2

Chiamami vecchia scuola.

f = popen("ls file*.txt", "r"); 
+3

Io chiamo inutile ... usa 'fork()' e 'exec()' insieme a un gruppo di altri tutti per qualcosa che dovrebbe prendere solo una chiamata di sistema – dlamotte

+0

Solo un commento da nit a diamotte, glob() sicuramente lo fa più di una chiamata di sistema. Effettua l'allocazione dinamica della memoria all'interno della struttura pglob fornita e deve leggere nella directory, quindi sono almeno due syscalls. Ma è solo una chiamata alla libreria, e quella è preferita. E data la soluzione di Wayne causerà la generazione di una shell che a sua volta chiamerà glob() o simile, è chiaro che la soluzione glob() è strettamente migliore. –

+0

Ick. Non è "vecchia scuola", è semplicemente orribile. -1. –

18

L'API POSIX specifica i glob() e globfree() funzioni per questo. Vedi lo man page. wordexp() e wordfree(), specificati anche da POSIX, supportano anche other kinds of expansions.

+0

Hah, non sto scherzando ... Lo fa. Grazie per aver postato questo! – dlamotte