Đối với linux hoặc unix máy móc, các os có hai chức năng đối phó với đường dẫn và tên tập tin. sử dụng man 3 basename để có thêm thông tin về các hàm này. Lợi thế của việc sử dụng chức năng được cung cấp bởi hệ thống là bạn không phải cài đặt tăng hoặc cần phải viết các chức năng của riêng bạn.
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);
Ví dụ mã từ trang người đàn ông:
char *dirc, *basec, *bname, *dname;
char *path = "/etc/passwd";
dirc = strdup(path);
basec = strdup(path);
dname = dirname(dirc);
bname = basename(basec);
printf("dirname=%s, basename=%s\n", dname, bname);
Bởi vì kiểu lập luận không const của basename() chức năng, đó là một chút phi thẳng về phía trước sử dụng bên trong này C++ . Dưới đây là một ví dụ đơn giản từ cơ sở mã của tôi:
string getFileStem(const string& filePath) const {
char* buff = new char[filePath.size()+1];
strcpy(buff, filePath.c_str());
string tmp = string(basename(buff));
string::size_type i = tmp.rfind('.');
if (i != string::npos) {
tmp = tmp.substr(0,i);
}
delete[] buff;
return tmp;
}
Việc sử dụng mới/xóa không được phong cách tốt. Tôi có thể đặt nó vào một khối try/catch trong trường hợp có sự cố xảy ra giữa hai cuộc gọi.
Nguồn
2017-04-07 22:19:58
Đồng ý. Trả lời câu hỏi gọn gàng nhất. – AndyUK
Trên thực tế, p.filename() là đường dẫn kiểu và sẽ được bao quanh bởi dấu ngoặc kép khi được chuyển đổi hoàn toàn, vì vậy bạn sẽ nhận được: tên tệp và đuôi mở rộng: "file.ext" Bạn có thể muốn p.filename(). string() thay thế. –
Với C++ 14/C++ 17, bạn có thể sử dụng 'std :: testing :: filesystem' resp' std :: filesystem'. Xem bài đăng từ Yuchen Zhong bên dưới. –