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

Вы можете либо использовать итератор прямо так, как вы упомянули, либо сохранить вторую коллекцию и добавить каждый элемент, который хотите удалить, в новую коллекцию, а затем удалитьAll в конце. Это позволяет вам использовать безопасность типа для каждого цикла за счет увеличения использования памяти и времени процессора (не должно быть огромной проблемой, если у вас нет действительно больших списков или действительно старого компьютера)

public static void main(String[] args)
{
    Collection<Integer> l = new ArrayList<Integer>();
    Collection<Integer> itemsToRemove = new ArrayList<Integer>();
    for (int i=0; i < 10; ++i) {
    l.add(new Integer(4));
    l.add(new Integer(5));
    l.add(new Integer(6));
    }
    for (Integer i : l)
    {
        if (i.intValue() == 5)
            itemsToRemove.add(i);
    }

    l.removeAll(itemsToRemove);
    System.out.println(l);
}
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
поделиться
Другие вопросы по тегам:

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