C++ 如何在c++;使用boost

C++ 如何在c++;使用boost,c++,boost,path-separator,C++,Boost,Path Separator,我有这样一条路径: boost::filesystem::path mypath("c:/test"); boost::filesystem::path mypath1("c:/test/); 我希望确保在将它们转换为字符串时,它们都显示为: c:/test/ 例如,如果我这样做: cout<<mypath.string()<<endl; cout<<mypath1.string()<<endl; 我如何在C++中使用Boost?< /P>

我有这样一条路径:

boost::filesystem::path mypath("c:/test");
boost::filesystem::path mypath1("c:/test/);
我希望确保在将它们转换为字符串时,它们都显示为:

c:/test/
例如,如果我这样做:

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

我如何在C++中使用Boost?< /P> < P>我不认为有内置函数。< /P> 不过,您可以使用此选项:

if ("." != p.filename()) 
   p += fs::path::preferred_separator;
如果路径以
/。

(可选)首先调用
p.remove_training_separator
,但如果它是输入的一部分,也会删除任何尾随双斜杠(某些应用程序将其视为具有重要意义)

#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";
    }
}

我认为文件系统库中的任何标准函数都不支持您所追求的功能,它总是将
C:/test
作为一个文件,将
C:/test/
作为一个目录,直到您检查它为止。。最好的方法是转换为字符串并检查它是否以路径分隔符结尾,如果不是,则将其添加到字符串中!你为什么排除“.”而不是“?@sercxjo实际上,我不记得了。我认为
只是一个坏例子-它不是一个有效的路径,假设它的意思是
”/“
,是不安全的。因此,我建议输入验证
不是有效的输入,并始终留下一个尾随/,包括
”/“
。老实说,我认为真正的问题是,输出格式对OP的重要性还很不清楚(对我来说,
/some/path//
没有比
/some/path/
更有意义)。我选择的示例是为了反映需求的结果有多奇怪,请参见最后的条目)@sercxjo Ah。我(和你)应该试一下。答案中的注释对此进行了解释:“如果路径以/”结尾,则不会添加分隔符”,比较:
#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";
    }
}
'.' "."
''  "/"
'/' "//"
'/tmp'  "/tmp/"
'/tmp/' "/tmp/"
'/tmp//'    "/tmp//"
'/tmp/.'    "/tmp/."
'/tmp/..'   "/tmp/../"
'/tmp/...'  "/tmp/.../"
'/tmp/aa.txt'   "/tmp/aa.txt/"
'c:\test.txt'   "c:\test.txt/"