Хорошие ответы, но я вижу, что у большинства из них есть некоторые проблемы:
Прежде всего, я думаю, что хороший ответ должен работать для полных имен файлов, имеющих заголовки пути, также он должен работать для Linux или Windows или, как уже упоминалось, он должен быть кроссплатформенным. Для большинства ответов; Имена файлов без расширения, но путь с именем папки, включая точку, функция не сможет вернуть правильное расширение: примеры некоторых тестов могут быть следующими:
const char filename1 = {"C:\\init.d\\doc"}; // => No extention
const char filename2 = {"..\\doc"}; //relative path name => No extention
const char filename3 = {""}; //emputy file name => No extention
const char filename4 = {"testing"}; //only single name => No extention
const char filename5 = {"tested/k.doc"}; // normal file name => doc
const char filename6 = {".."}; // parent folder => No extention
const char filename7 = {"/"}; // linux root => No extention
const char filename8 = {"/bin/test.d.config/lx.wize.str"}; // ordinary path! => str
" brian newman " не удастся выполнить для filename1 и filename4.
и большинство других ответов, основанных на обратном поиске, потерпят неудачу для filename1.
Я предлагаю включить следующий метод в ваш источник:
которая является функцией, возвращающей индекс первого символа расширения или длину заданной строки, если она не найдена.
size_t find_ext_idx(const char* fileName)
{
size_t len = strlen(fileName);
size_t idx = len-1;
for(size_t i = 0; *(fileName+i); i++) {
if (*(fileName+i) == '.') {
idx = i;
} else if (*(fileName + i) == '/' || *(fileName + i) == '\\') {
idx = len - 1;
}
}
return idx+1;
}
вы можете использовать приведенный выше код в вашем приложении на c ++, как показано ниже:
std::string get_file_ext(const char* fileName)
{
return std::string(fileName).substr(find_ext_idx(fileName));
}
Последний пункт в некоторых случаях папка присваивается имени файла в качестве аргумента и включает точку в имени папки, функция будет возвращать точку в конце папки, поэтому лучше сначала проверить, что данное имя является именем файла, а не папкой имя.