Qual è il modo C++ del linguaggio Perl:Glob file in C++
my @files = glob("file*.txt");
foreach my $file (@files) {
# process $file
}
Qual è il modo C++ del linguaggio Perl:Glob file in C++
my @files = glob("file*.txt");
foreach my $file (@files) {
# process $file
}
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;
}
È 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.
Cosa? POSIX non è uno standard abbastanza buono? –
Chiamami vecchia scuola.
f = popen("ls file*.txt", "r");
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
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. –
Ick. Non è "vecchia scuola", è semplicemente orribile. -1. –
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.
Hah, non sto scherzando ... Lo fa. Grazie per aver postato questo! – dlamotte
C'è QUALCUNO di spinta non può fare?!?! – DVK
@ 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
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