2010-05-07 4 views
9

펄의 관용구의 C++ 방식의 새로운 기능 :파일 글롭 ++

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

    # process $file 
} 

답변

7

디렉토리의 내용을 읽는 표준 C++ 기능이 없기 때문에이를 에뮬레이트하는 표준 C++ 방법은 없습니다. 당신이 할 수있는 일은 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

아무 것도 할 수 없습니까?!?! – DVK

+0

@ Wilhelm : 감사합니다. 어떻게 컴파일합니까? 나는 이것을 시도했지만 실패했다.'g ++ -I ~/.boost/include/boost-1_38 wiltell_code.cpp -o wiltell_code' – neversaint

+2

어떤 오류가 발생 했습니까? 컴파일러, 링커? 누락 된 include : ''을 추가하십시오. 'std :: for_each()'라고 말하거나'using' 문을 추가하십시오. Linux 또는 Mac에 있습니까? 리눅스를 사용하고 있다면'boost_filesystem'에 링크해야합니다. g ++을 사용하면'-lboost_filesystem'을 말할 수 있습니다. Mac을 사용하고 있다면'boost_system'에 링크해야합니다. – wilhelmtell

0

당신은 fnmatch을 사용하여 "글로브"를 모방 할 수는. 그러나 디렉토리를 열고 내용을 읽고 fnmatch을 사용하여 각 항목을 일치시켜야합니다.

표준 AFAIK와 직접적인 동일한 기능은 없습니다.

+1

무엇? POSIX는 표준이 아닙니다. –

-2

저에게 전화하십시오.

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

필자는 불필요하다고 ... 하나의 시스템 콜만을 사용해야하는 다른 것들과 함께'fork()'와'exec()'를 사용한다. – dlamotte

+0

diamotte의 주석에 가장 가까운 glob 둘 이상의 시스템 호출. 그것은 당신이 제공하는 pglob 구조체의 내부에서 동적 인 메모리 할당을 수행하며, 적어도 두 개의 syscall이되도록 디렉토리에서 읽어야한다. 그러나 이것은 단지 하나의 라이브러리 호출이며, 이는 선호됩니다. 그리고 Wayne의 해결책이 주어지면 셸이 생성되어 glob() 또는 비슷한 것을 호출하게 될 것입니다. glob() 솔루션이 엄격하게 더 낫습니다. –

+0

Ick. 그것은 "오래된 학교"가 아니며 단지 끔찍한 일입니다. -1. –

18

POSIX API는이를 위해 glob()globfree() 기능을 지정합니다. man page을 참조하십시오. wordexp()wordfree()도 POSIX로 지정되며 other kinds of expansions도 지원합니다.

+0

하, 농담이 아니야. 그렇지. 게시 해 주셔서 감사합니다! – dlamotte