C++ 如何判断目录项是否是C+中目录迭代器的结尾+;
使用C++ 如何判断目录项是否是C+中目录迭代器的结尾+;,c++,c++17,C++,C++17,使用std::filesystem,如何判断directory\u条目是目录迭代器的结尾 下面是我尝试做的一个例子: autoit=fs::directory\u迭代器(path); for(const auto&i:it){ if(i==it.back()){//这适用于'vector',但不适用于'directory\u迭代器` doSomethingWith(i);//仅在最后一个条目上调用此函数。 } } 您可以使用std::filesystem::end。请参见此处的文档: 但在您的
std::filesystem
,如何判断directory\u条目
是目录迭代器的结尾
下面是我尝试做的一个例子:
autoit=fs::directory\u迭代器(path);
for(const auto&i:it){
if(i==it.back()){//这适用于'vector',但不适用于'directory\u迭代器`
doSomethingWith(i);//仅在最后一个条目上调用此函数。
}
}
您可以使用std::filesystem::end
。请参见此处的文档:
但在您的示例中,不需要显式检查,因为循环本身将正确结束。默认构造的目录迭代器是结束迭代器。请参阅构造函数列表中的条目一:来自-
如果目录迭代器报告错误或超过最后一个目录条目,它将等于默认构造的迭代器,也称为结束迭代器。两个末端迭代器总是相等的,取消引用或增加末端迭代器是未定义的行为
但是,问题是目录迭代器的数量在增加
因此,一种可能的解决方案是使用post increment
操作来查找最后一个目录项
auto it = fs::directory_iterator(path);
for (auto i = fs::begin(it); fs::begin(i) != fs::end(it); ) {
auto entry = *(i++);
if (fs::begin(i) == fs::end(it)) { // sugercoat of `i == fs::directory_iterator{}`
doSomethingWith(entry); // this is the last directory entry
} else {
doSomethingElse(entry); // non-last entry
}
}
什么东西不起作用?@Carlosback
不是std::filesystem::directory\u迭代器的成员
!!如果有返回
,则根本不需要循环!你只需要记住你在循环外的变量中看到的每一个,循环退出后,它就会出现。但我猜不管你想做什么都不能用这种方式解决。目录迭代器返回的条目顺序是未指定的:在随后的两次调用中它甚至可能不相同-即使目录未被修改!它当然不需要匹配任何其他类型的顺序,无论是字母顺序,还是操作系统提供给您的顺序…std::filesystem::end(directory\u iterator)
返回一个新的directory\u iterator
而不是directory\u entry
,有任何关于如何使用它的提示吗,谢谢?而且,我不想检查以结束循环,我想以不同的方式处理iter
的结尾,比如if(end){doSomeThing(I)}else{doSomeThingElse(I)}
,@AhmedKamal,我认为你应该编辑你的问题,并补充说你想以不同的方式处理目录中的最后一项。