#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
Поможет? Я так не думаю. Я посмотрю на Winapisplitpath
, спасибо!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 Я еще не думал об этом. Но вы можете задать новый вопрос с новыми требованиями.