Как получить расширение файла от строки в C++

Учитывая строку "filename.conf", как я проверяю дополнительную часть?

Мне нужно кросс-платформенное решение.

73
задан manlio 11 July 2019 в 13:36
поделиться

6 ответов

Необходимо удостовериться, что Вы заботитесь об именах файлов с более тогда одной точкой. пример: c:\.directoryname\file.name.with.too.many.dots.ext не был бы обработан правильно strchr или find.

, Мой фаворит будет библиотека файловой системы повышения , которые имеют расширение (путь) функция

34
ответ дан Thomas Bonini 24 November 2019 в 12:05
поделиться
_splitpath, _wsplitpath, _splitpath_s, _wsplitpath_w

я думаю, что это - Windows (SDK Платформы) только?

3
ответ дан Aardvark 24 November 2019 в 12:05
поделиться

Принятие Вас имеет доступ к STL:

std::string filename("filename.conf");
std::string::size_type idx;

idx = filename.rfind('.');

if(idx != std::string::npos)
{
    std::string extension = filename.substr(idx+1);
}
else
{
    // No extension found
}

Редактирование: Это - кросс-платформенное решение, так как Вы не упоминали платформу. Если Вы будете конкретно в Windows, Вы захотите усилить Windows определенные функции, упомянутые другими в потоке.

30
ответ дан 17 of 26 24 November 2019 в 12:05
поделиться

Лучший способ не состоит в том, чтобы записать код, который делает это, но называет существующие методы. В окнах метод PathFindExtension является, вероятно, самым простым.

Итак, почему Вы не записали бы свое собственное?

ну, возьмите strrchr пример, что происходит, когда Вы используете тот метод на следующей строке "c:\program files\AppleGate.Net\readme"? "Действительно ли.Net\readme" является расширением? Легко записать что-то, что работает на несколько случаев в качестве примера, но может быть намного более твердо записать что-то, что работает на все случаи.

41
ответ дан Torlack 24 November 2019 в 12:05
поделиться

Действительно ли это слишком просто из решения?

#include <iostream>
#include <string>

int main()
{
  std::string fn = "filename.conf";
  if(fn.substr(fn.find_last_of(".") + 1) == "conf") {
    std::cout << "Yes..." << std::endl;
  } else {
    std::cout << "No..." << std::endl;
  }
}
142
ответ дан LogicStuff 24 November 2019 в 12:05
поделиться

Использование std :: string find / rfind решает ЭТУ проблему, но если вы много работаете с путями, вам следует взглянуть на boost :: filesystem :: path, так как это сделает ваш код намного чище. чем возиться с необработанными строковыми индексами / итераторами.

Я предлагаю Boost, поскольку это высококачественная, хорошо протестированная (с открытым исходным кодом и коммерчески) бесплатная и полностью переносимая библиотека.

3
ответ дан 24 November 2019 в 12:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: