Строка пути из std::вектор`

#c #algorithm #iterator #stdvector #stdstring

Вопрос:

У меня есть вектор символов, который выглядит примерно так

 C:/Users/person/Desktop/Albedo.pngC:/Users/person/Desktop/Metallic.pngC:/Users/person/Desktop/Noice.pngC:/Users/person/Desktop/AO.png
 

Как разделить вектор на отдельные пути?
То есть я хочу, чтобы у меня

 std::string path1; // = C:/Users/person/Desktop/Albedo.png;
std::string path2; // = C:/Users/person/Desktop/Metallic.png;
std::string path3; // = C:/Users/person/Desktop/Noice.png;
std::string path4; // = C:/Users/person/Desktop/AO.png;
 

Есть идеи, как я могу это сделать?
Заранее спасибо!

Комментарии:

1. Непонятно, что вы пытаетесь сделать. Используйте winapi splitpath и/или std::getline .

2. std::getline Поможет? Я так не думаю. Я посмотрю на Winapi splitpath , спасибо!

3. Вы также можете проверить <filesystem> .

4. Если нет фиксированного числа «отдельных путей», извлеките a std::vector<std::string> , а не отдельные переменные. В любом случае, начало каждой строки обозначается наличием триплета, состоящего из буквы (диска), за которой следует a ':' , а затем a '/' . Придумайте, как перебирать вектор в поисках этого триплета и извлекать символы между двумя триплетами в строку. Кроме того, некоторые системы (например, Windows) также используют a '' (который должен быть разделен строковыми литералами char или строковыми литералами) в качестве разделителя путей. Нет, я не собираюсь писать код — вам нужно приложить некоторые усилия, чтобы решить ВАШУ проблему

5. Я не видел полную строку — я разговариваю по телефону. Пожалуйста, не обращайте внимания на мои комментарии.

Ответ №1:

Например, простой подход при условии, что каждый путь в векторе имеет расширение .png , может выглядеть, например, следующим образом, как показано в демонстрационной программе ниже.

 #include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <cstring>

int main() 
{
    const char *s ="C:/Users/person/Desktop/Albedo.png"
                   "C:/Users/person/Desktop/Metallic.png"
                   "C:/Users/person/Desktop/Noice.png"
                   "C:/Users/person/Desktop/AO.png";
    std::vector<char> v( s, s   std::strlen( s ) );
    
    std::vector<std::string> paths;
    const char *ext = ".png";
    size_t n = std::strlen( ext );
    
    for ( auto first = std::begin( v ), last = std::end( v ), it = first;
          ( it = std::search( first, last, ext, ext   n ) ) != last;
          first = it
        )
    {
        std::advance( it, n );
        paths.push_back( { first, it } );
    }         
    
    for ( const auto amp;path : paths )
    {
        std::cout << path << 'n';
    }
    
    return 0;
}
 

Вывод программы является

 C:/Users/person/Desktop/Albedo.png
C:/Users/person/Desktop/Metallic.png
C:/Users/person/Desktop/Noice.png
C:/Users/person/Desktop/AO.png
 

Комментарии:

1. Приятно, большое вам спасибо! Работает как заклинание! Знаете ли вы какой-либо способ сделать это расширение независимым? Я подумываю о разделении, C:/ но тогда это сделало бы его зависимым от платформы 🙁

2. @FahimFuad Я еще не думал об этом. Но вы можете задать новый вопрос с новыми требованиями.