2010-05-07 11 views
9

Was ist die C++ Art und Weise von der Perl-Idiom:Datei-Glob in C++

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

    # process $file 
} 

Antwort

7

Es gibt keine Standard-C++ - Methode, dies zu emulieren, da es keine Standard-C++ - Funktionalität zum Lesen des Inhalts eines Verzeichnisses gibt. Was Sie tun können, ist 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

Gibt es etwas Boost kann nicht tun?!?! – DVK

+0

@Wilhelm: Danke. Wie kompilierst du das? Ich habe es versucht, aber scheiterte 'g ++ -I ~/.boost/include/boost-1_38 wiltell_code.cpp -o wiltell_code' – neversaint

+2

Welchen Fehler bekommen Sie? Compiler, Linker? Stellen Sie sicher, dass Sie das fehlende Include hinzufügen: ''. Sagen Sie 'std :: for_each()' oder fügen Sie eine 'using' Anweisung hinzu. Bist du auf Linux oder Mac? Wenn Sie unter Linux sind, stellen Sie sicher, dass Sie mit 'boost_filesystem' verlinken. Mit g ++ können Sie '-lboost_filesystem 'sagen. Wenn du auf einem Mac bist, musst du wahrscheinlich auch mit 'boost_system' verlinken. – wilhelmtell

0

Sie können die "glob" imitieren fnmatch verwenden. Aber Sie müssen das Verzeichnis öffnen, den Inhalt lesen und jeden Eintrag mit fnmatch abgleichen.

Kein direktes Äquivalent, das ist Standard AFAIK.

+1

Was? POSIX ist kein guter Standard? –

-2

Rufen Sie mich an der alten Schule.

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

Ich nenne es unnötig ... verwendet 'fork()' und 'exec()' zusammen mit einer Reihe von anderen alles für etwas, das nur einen Systemaufruf benötigt – dlamotte

+0

Nur ein Nit zu Diamottes Kommentar, glob() sicherlich mehr als ein Systemaufruf Es übernimmt die dynamische Speicherzuweisung innerhalb der von Ihnen bereitgestellten pglob-Struktur und muss es im Verzeichnis einlesen, das sind also mindestens zwei syscalls. Aber es ist nur ein Bibliotheksanruf, und das ist bevorzugt. Und da Waynes Lösung dazu führt, dass eine Shell erzeugt wird, die wiederum glob() oder ähnliches aufruft, ist klar, dass die glob() Lösung strikt besser ist. –

+0

Ick. Das ist keine "alte Schule", es ist einfach nur schrecklich. -1. –

18

POSIX Die API gibt die glob() und globfree() Funktionen für diese. Siehe die man page. wordexp() und wordfree(), auch von POSIX angegeben, unterstützen Sie auch other kinds of expansions.

+0

Hah, kein Scherz ... Es tut. Danke für das Posten! – dlamotte