3

次のようなパスがあります。

boost::filesystem::path mypath("c:/test");
boost::filesystem::path mypath1("c:/test/);

それらを文字列に変換すると、両方が次のように表示されることを確認したい:

c:/test/

たとえば、次のようにします。

cout<<mypath.string()<<endl;
cout<<mypath1.string()<<endl;

どちらも次のように出力します。

c:/test/

ブーストを使用してC ++でこれを行うにはどうすればよいですか?

4

1 に答える 1

1

組み込み関数はないと思います。

ただし、これを使用できます。

if ("." != p.filename()) 
   p += fs::path::preferred_separator;

パスがで終わる場合、これはセパレーターを追加しません/.

必要に応じて、最初に呼び出しますp.remove_trailing_separatorが、それが入力の一部である場合は、末尾の二重スラッシュも削除されます (一部のアプリケーションは、これを重要な意味を持つものとして扱います)。

Live On Coliru

#include <boost/filesystem.hpp>
#include <boost/range/iterator_range.hpp>
#include <iostream>

namespace fs = boost::filesystem;

int main(int argc, char** argv) {
    for (std::string s : boost::make_iterator_range(argv+1, argv+argc)) {
        fs::path p = s;
        //p.remove_trailing_separator();
        if ("." != p.filename())
            p += fs::path::preferred_separator;

        std::cout << "'" << s << "'\t" << p << "\n";
    }
}

プリント(明らかにLinux上):

'.' "."
''  "/"
'/' "//"
'/tmp'  "/tmp/"
'/tmp/' "/tmp/"
'/tmp//'    "/tmp//"
'/tmp/.'    "/tmp/."
'/tmp/..'   "/tmp/../"
'/tmp/...'  "/tmp/.../"
'/tmp/aa.txt'   "/tmp/aa.txt/"
'c:\test.txt'   "c:\test.txt/"
于 2015-10-28T09:40:39.907 に答える