Do maszyn Linux lub UNIX, OS ma dwie funkcje czynienia z nazw ścieżek i plików. użyj man 3 basename, aby uzyskać więcej informacji o tych funkcjach. Zaletą korzystania z funkcjonalności systemu jest to, że nie trzeba instalować funkcji zwiększania dawki ani konieczności pisania własnych funkcji.
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);
przykład kod ze strony człowieka:
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);
powodu const typu argumentu funkcji basename(), to jest trochę nie prosto do przodu za pomocą tego wewnątrz kodu C++ . Oto prosty przykład z mojej bazy kodu:
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;
}
Użycie nowego/usunięcia nie jest dobrym stylem. Mógłbym umieścić go w try-catch bloku na wypadek, gdyby coś się stało między dwoma połączeniami.
Uzgodnione. Odpowiedzi na pytanie w sposób zwięzły. – AndyUK
W rzeczywistości p.nazwa_pliku() jest ścieżką typu i będzie otoczona cudzysłowami, gdy zostanie niejawnie przekonwertowana, dzięki czemu otrzymasz: nazwa pliku i rozszerzenie: "plik.ekst" Możesz chcieć p.filename(). zamiast tego ciąg(). –
W C++ 14/C++ 17 można użyć 'std :: experimental :: filesystem' lub' std :: filesystem'. Zobacz post z Yuchen Zhong poniżej. –