boost::adaptors::transformed失败,std::filesystem::d irectory_iterator

boost::adaptors::transformed fails with std::filesystem::directory_iterator

提问人:Edward Sarkisyan 提问时间:11/10/2022 最后编辑:Edward Sarkisyan 更新时间:11/12/2022 访问量:54

问:

为什么里面是空的? 我尝试过不使用过滤器,但它没有帮助。entryboost::adaptors::transformed()

#include <boost/range/adaptors.hpp>
#include <boost/static_string/static_string.hpp>
#include <boost/utility/string_view.hpp>
#include <filesystem>
#include <iostream>

const auto root = std::filesystem::path(".");
const auto names = boost::make_iterator_range(
    std::filesystem::directory_iterator(root),
    std::filesystem::directory_iterator {}
) |
boost::adaptors::filtered([](const std::filesystem::directory_entry& entry)
{
    const auto name = entry.path().stem().string();
    const auto suff = entry.path().extension().string();
    return suff == ".cfg" && !boost::string_view(name).starts_with("__");
}) |
boost::adaptors::transformed([](const std::filesystem::directory_entry& entry)
{
    auto result = boost::static_string<64>{};
    result = entry.path().stem().string();
    std::cout << result << std::endl;
    return result;
});

更新

// append this lines
std::cout << boost::size(names) << std::endl;
std::cout << boost::size(names) << std::endl;

第一次调用 of 返回正确的名称计数,但第二次调用返回 1。我认为这是boost::size()std::filesystem::directory_iterator

C++ 提升 范围 文件系统 std

评论


答:

0赞 sehe 11/10/2022 #1

我已将您的图像复制到一个独立的程序中,但看不到您的问题:

Live On Coliru(科里鲁生活公寓)

#include <boost/range/adaptors.hpp>
#include <boost/static_string/static_string.hpp>
#include <boost/utility/string_view.hpp>
#include <filesystem>
#include <iostream>

int main() {
    std::filesystem::path root = ".";

    const auto names =
        boost::make_iterator_range(std::filesystem::directory_iterator(root),
                                   std::filesystem::directory_iterator{}) |
        boost::adaptors::filtered([](const std::filesystem::directory_entry& entry) {
            const auto name = entry.path().stem().string();
            const auto suff = entry.path().extension().string();
            return suff == ".cfg" && !boost::string_view(name).starts_with("__");
        }) |
        boost::adaptors::transformed([](const std::filesystem::directory_entry& entry) {
            auto result = boost::static_string<64>{};
            result      = entry.path().stem().string();
            return result;
        });

    for (auto&& name : names) {
        std::cout << " - " << name << "\n";
    }
}

创建一些文件,例如:

touch test{001..022}.cfg
touch __hidden.cfg

指纹

 - test001
 - test006
 - test013
 - test017
 - test015
 - test021
 - test008
 - test012
 - test016
 - test002
 - test007
 - test005
 - test010
 - test009
 - test020
 - test014
 - test019
 - test022
 - test018
 - test011
 - test004
 - test003

奖金

简化和风格:

Live On Coliru(科里鲁生活公寓)

#include <boost/range/adaptors.hpp>
#include <boost/static_string/static_string.hpp>
#include <boost/utility/string_view.hpp>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;

bool is_config(fs::path const& p) {
    auto name = p.stem().string();

    return p.extension() == ".cfg" &&
        !boost::string_view(name).starts_with("__");
};

auto stem(fs::path const& p) { return boost::static_string<64>{p.stem().string()}; }

auto cfgs(fs::path root) {
    using namespace boost::adaptors;
    auto files = boost::make_iterator_range(fs::directory_iterator(root), {});
    return files | filtered(is_config) | transformed(stem);
}

int main() {
    for (auto cfg : cfgs("."))
        std::cout << " - " << cfg << "\n";
}

显然,输出相同。

评论

0赞 sehe 11/10/2022
在此处添加了一些样式简化
0赞 Edward Sarkisyan 11/10/2022
你用的是什么编译器?
0赞 sehe 11/10/2022
有几个,Coliru 上的那个是 GCC 12.1.0,但你可以在这里混合搭配:Compiler Explorer。你有问题为什么想知道吗?
0赞 sehe 11/10/2022
只是为了好玩,这里有一个兼容 C++11 的 coliru.stacked-crooked.com/a/ec573a46459dea4d。请注意,按照这个速度,我会接受副本:coliru.stacked-crooked.com/a/34e0c7d90647791d
0赞 Edward Sarkisyan 11/10/2022
你帮了我很多。我尝试使用超过 1 次,但我没有在示例中写它(不认为这是问题)。谢谢!names