提问人:Edward Sarkisyan 提问时间:11/10/2022 最后编辑:Edward Sarkisyan 更新时间:11/12/2022 访问量:54
boost::adaptors::transformed失败,std::filesystem::d irectory_iterator
boost::adaptors::transformed fails with std::filesystem::directory_iterator
问:
为什么里面是空的?
我尝试过不使用过滤器,但它没有帮助。entry
boost::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
答:
0赞
sehe
11/10/2022
#1
我已将您的图像复制到一个独立的程序中,但看不到您的问题:
#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
奖金
简化和风格:
#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
只是为了好玩,这里有一个兼容 C++11 的 coliru.stacked-crooked.com/a/ec573a46459dea4d。请注意,按照这个速度,我会接受副本:coliru.stacked-crooked.com/a/34e0c7d90647791d
0赞
Edward Sarkisyan
11/10/2022
你帮了我很多。我尝试使用超过 1 次,但我没有在示例中写它(不认为这是问题)。谢谢!names
评论