Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何判断目录项是否是C+中目录迭代器的结尾+;_C++_C++17 - Fatal编程技术网

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
  }
}

什么东西不起作用?@Carlos
back
不是
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,我认为你应该编辑你的问题,并补充说你想以不同的方式处理目录中的最后一项。