如何将路径拆分为单独的字符串?

10

你想要分离路径的所有部分,还是只需要从文件名中分离父目录? - Stian Svedenborg
@idanshmu:你能否提供一些输入和输出的示例? - N20084753
2
你看过path::iterator了吗? - Jarod42
4个回答

15

的确,有path_iterator。但如果你想要优雅:

#include <boost/filesystem.hpp>

int main() {
    for(auto& part : boost::filesystem::path("/tmp/foo.txt"))
        std::cout << part << "\n";
}

输出:

"/"
"tmp"
"foo.txt"

    for(auto& part : boost::filesystem::path("/tmp/foo.txt"))
        std::cout << part.c_str() << "\n";

打印

/
tmp
foo.txt

不需要担心运动部件


5
std::vector<std::string> SplitPath(const boost::filesystem::path &src) {
    std::vector<std::string> elements;
    for (const auto &p : src) {
        elements.emplace_back(p.filename());
    }
    return elements;
}

实际上,当这个回答被发布时,我仍在打字和编译示例。 - sehe
1
如果elements的类型为vector<string>,那么你应该写成elements.emplace_back(p.filename().string()) - victor1234

1
如果您没有C++11的auto功能,或者在编写跨平台代码时使用boost::filesystem::path可能会出现std::wstring:
std::vector<boost::filesystem::path> elements;
for (boost::filesystem::path::iterator it(filename.begin()), it_end(filename.end()); it != it_end; ++it) 
{
    elements.push_back(it->filename());
}

1
如果您想手动完成所有操作而不使用任何库,则可以使用此方法。它将给定的完整路径拆分为相应的名称并将它们存储在向量中。
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    string filePath = "C:\\ProgramData\\Users\\CodeUncode\\Documents";
    vector<string> directories;
    size_t position=0, currentPosition=0;
    
    while(currentPosition != -1)
    {
        currentPosition = filePath.find_first_of('\\', position);
        directories.push_back(filePath.substr(position,currentPosition-position));
        position = currentPosition+1;
    }
    for(vector<string>::iterator it = directories.begin(); it!=directories.end(); it++)
        cout<<*it<<endl;

    return 0;
} 

输出:

C:
ProgramData
Users
CodeUncode
Documents

你在这里发布了相同的(糟糕的)代码链接。最好不要在多个问题中发布“重复”的答案...考虑删除一个答案并改进另一个答案。 - Adrian Mole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接