Символ '\ c' против символа 'c' в путях C ++ - PullRequest
0 голосов
/ 01 марта 2020

Я имею в виду, это довольно странно. У меня есть const char PATH = "hello \ cpp \ visualstudio \ nano \ sources", который представляет путь к чему-то. Он может содержать только маленькие буквы Engli sh и символ '\' (backsla sh). Мне нужно найти папки по этому пути и т.е. выводить каждую из них на новой строке. В моем примере это будет:

привет

cpp

visualstudio

nano

sources

Как мне это сделать? :) Не могу найти никакого решения ... Если вы не знаете, в C ++, любой другой символ с '\' перед ним, кроме '\ a', '\ b', '\ f', '\ n ',' \ r ',' \ t 'и' \ v 'одинаковы без' \ '. Я имею в виду '\ c' точно так же, как 'c'. Не могу найти новую папку или нет.

Не могли бы вы мне помочь? :)

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Вы можете использовать необработанный строковый литерал : R"raw(hello\cpp\visualstudio\nano\sources)raw"; или , вы можете просто использовать прямую косую черту, как на UNIX, которую Windows поддерживает очень хорошо: "hello/cpp/visualstudio/nano/sources"; или используйте std :: filesystem :: path .

1 голос
/ 01 марта 2020

Мне нужно найти папки по этому пути, то есть вывести каждую из них на новой строке.

Я предлагаю вам использовать C ++ 17 std::filesystem::path с поддержкой разделения путей вверх.

#include <iostream>
#include <vector>
#include <filesystem>

namespace fs = std::filesystem;

std::vector<fs::path> separate(const fs::path& p) {
    std::vector<fs::path> rv;

    rv.push_back(p.filename()); // save only the basename part

    // iterate up to the paths root
    for(fs::path old = p, t = p.parent_path();
        t != old && not t.empty();
        old = t, t = t.parent_path())
    {
        rv.push_back(t.filename());
    }
    return rv;
}

int main() {
    std::filesystem::path path = std::filesystem::path{"hello"} / "cpp" / "visualstudio" /
                                 "nano" / "sources";

    for(const auto& p : separate(path)) {
        std::cout << p << '\n';
    }
}

Вывод:

"sources"
"nano"
"visualstudio"
"cpp"
"hello"

Если вы хотите сделать это в обратном порядке, вы можете использовать vector s rbegin() и rend(), или просто измените его в функции separate().

...