2015-01-03 4 views
-7

У меня есть полный путь, как /a/b/c/text.txtКак получить папку и часть файла полного пути?

Как получить/a/b/c и text.txt с помощью C++? Предпочитают использовать некоторую стандартную библиотечную функцию.

Я планирую использовать

подстроку и find_last_of

+3

Вы вообще что-то пробовали –

+0

Я пытаюсь использовать какой-то метод std :: string, но интересно, если в начале есть неправильное направление –

+0

Особенно хотелось бы избежать библиотеки Boost, может быть. Я знаю, что boost может поддерживать метод пути. –

ответ

-2

на основе дублирования (StackOverflow .com/a/3071694/2082964), я думаю, что решить вопрос,

Обратите внимание, что в зависимости от того, что вам нужно для трейдинга/или нет; для моего вопроса, мне нужно, поэтому я немного изменил.

// string::find_last_of 
    #include <iostream> 
    #include <string> 
    using namespace std; 

    void SplitFilename (const string& str) 
    { 
     size_t found; 
     cout << "Splitting: " << str << endl; 
     found=str.find_last_of("/\\"); 
     cout << " folder: " << str.substr(0,found+1) << endl; 
     cout << " file: " << str.substr(found+1) << endl; 
    } 

    int main() 
    { 
     string str1 ("/usr/bin/man"); 
     string str2 ("c:\\windows\\winhelp.exe"); 

     SplitFilename (str1); 
     SplitFilename (str2); 

     return 0; 
    } 
+0

Вы должны выполнить проверку ошибок на возвращаемое значение из 'find_last_of' – Praetorian

+0

@Praetorian, что вы имеете в виду здесь? Если find_last_of не найдет, он вернет -1, правильно? –

+0

Он возвращает 'string :: npos' (который равен -1). Если это произойдет, последующие вызовы 'substr' возвратят неверные результаты. Ну, может быть, неправильно. Подстрока * folder * будет пустой, а подстрока * file * будет представлять собой весь ввод, который может или не может быть поведением, которое вы хотите. – Praetorian

0

Вы можете попробовать следующее:

std::string path = "https://stackoverflow.com/a/b/c/text.txt"; 
size_t lastSlash = path.rfind("/"); 
if (lastSlash != std::string::npos){ 
    std::string filename = path.substr(lastSlash + 1); 
    std::string folder = path.substr(0, lastSlash); 
} 

Обратите внимание, что это работает только для слэша, как это.

+0

Лично я предпочитаю использовать find_last_of, так как он охватывает «/» и «\» –

+0

Почему бы просто не накрывать соответствующий в зависимости от платформы. –

+0

Хорошо, вы можете это сделать. Я просто понял, что у них есть пример, в основном идентичный моему на cplusplus.com, используя find_last_of: http://www.cplusplus.com/reference/string/string/find_last_of/ Некоторые платформы (например, Windows) используют оба. – user1488118

Смежные вопросы