2010-05-07 32 views

Trả lời

7

Không có cách C++ chuẩn nào để mô phỏng điều này vì không có chức năng C++ chuẩn nào để đọc nội dung của thư mục. Những gì bạn có thể làm là sử dụng 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ó bất kỳ sự thúc đẩy nào không thể làm được?!?! – DVK

+0

@Wilhelm: Cảm ơn. Làm thế nào để bạn biên dịch? Tôi đã thử điều này nhưng không thành công 'g ++ -I ~/.boost/include/boost-1_38 wiltell_code.cpp -o wiltell_code' – neversaint

+2

Lỗi nào bạn nhận được? Trình biên dịch, trình liên kết? Hãy chắc chắn rằng bạn thêm vào bao gồm thiếu: ''. Nói 'std :: for_each()' hoặc thêm câu lệnh 'using'. Bạn đang sử dụng Linux hay Mac? Nếu bạn đang sử dụng Linux, hãy đảm bảo rằng bạn liên kết với 'boost_filesystem'. Với g ++, bạn có thể nói '-lboost_filesystem'. Nếu bạn đang sử dụng máy Mac, có thể bạn cũng cần phải liên kết với 'boost_system'. – wilhelmtell

0

Bạn có thể bắt chước các "glob" sử dụng fnmatch. Nhưng bạn sẽ cần phải mở thư mục, đọc nội dung và đối sánh từng mục nhập bằng cách sử dụng fnmatch.

Không tương đương trực tiếp với tiêu chuẩn AFAIK.

+1

Cái gì? POSIX không phải là một tiêu chuẩn đủ tốt? –

-2

Gọi cho tôi trường cũ.

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

Tôi gọi nó là không cần thiết ... sử dụng 'fork()' và 'exec()' cùng với một bó của tất cả những thứ khác chỉ nên lấy một hệ thống gọi – dlamotte

+0

Chỉ cần một bình luận của nitam diamotte, glob() nhiều hơn một cuộc gọi hệ thống. Nó phân bổ bộ nhớ động bên trong cấu trúc pglob mà bạn cung cấp, và nó phải đọc trong thư mục, vì vậy đó là ít nhất hai syscalls. Nhưng đó chỉ là một cuộc gọi thư viện và được ưu tiên. Và với giải pháp của Wayne sẽ làm cho một shell được sinh ra, lần lượt gọi glob() hoặc tương tự, rõ ràng là giải pháp glob() hoàn toàn tốt hơn. –

+0

Ick. Đó không phải là "trường học cũ", nó chỉ đơn giản là khủng khiếp. -1. –

18

API POSIX chỉ định các chức năng glob()globfree(). Xem man page. wordexp()wordfree(), cũng được chỉ định bởi POSIX, cũng hỗ trợ other kinds of expansions.

+0

Hah, không đùa ... Nó có. Cảm ơn bạn đã đăng bài đó! – dlamotte