C++ 使用BOOST\u FOREACH迭代目录中的所有文件
可以使用boost::filesystem和boost\u FOREACH对目录中的所有文件进行迭代吗? 我试过了C++ 使用BOOST\u FOREACH迭代目录中的所有文件,c++,boost,boost-filesystem,boost-foreach,C++,Boost,Boost Filesystem,Boost Foreach,可以使用boost::filesystem和boost\u FOREACH对目录中的所有文件进行迭代吗? 我试过了 此代码可编译、运行,但不会产生所需的结果。您的dirPath要么不是序列,要么序列大小为1 BOOST_FOREACH迭代序列。但究竟什么才是序列呢?由于BOOST_FOREACH构建在BOOST.Range之上,因此它自动支持BOOST.Range识别为序列的类型。具体来说,BOOST_FOREACH使用满足单通道范围概念的类型。例如,我们可以将BOOST_FOREACH用于:
此代码可编译、运行,但不会产生所需的结果。您的
dirPath
要么不是序列,要么序列大小为1
BOOST_FOREACH迭代序列。但究竟什么才是序列呢?由于BOOST_FOREACH构建在BOOST.Range之上,因此它自动支持BOOST.Range识别为序列的类型。具体来说,BOOST_FOREACH使用满足单通道范围概念的类型。例如,我们可以将BOOST_FOREACH用于:
- STL容器
- 阵列
- 以Null结尾的字符串(char和wchar\t)
- 一对迭代器
对STL容器的支持非常普遍;任何看起来像STL容器的东西都很重要。如果它有嵌套的迭代器和const_迭代器类型以及begin()和end()成员函数,BOOST_FOREACH将自动知道如何在其上迭代。正是通过这种方式,boost::iterator_range和boost::sub_range与boost_FOREACH一起工作
您可以使用
BOOST\u FOREACH
对目录中的文件进行迭代,如下所示:
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
namespace fs = boost::filesystem;
fs::path targetDir("/tmp");
fs::directory_iterator it(targetDir), eod;
BOOST_FOREACH(fs::path const &p, std::make_pair(it, eod))
{
if(fs::is_regular_file(p))
{
// do something with p
}
}
#包括
#包括
名称空间fs=boost::filesystem;
fs::path targetDir(“/tmp”);
目录迭代器it(targetDir),eod;
BOOST_FOREACH(fs::path const&p,std::make_pair(it,eod))
{
if(fs::is_regular_file(p))
{
//用p做点什么
}
}
所以我猜我错过了这次机会,但即使在我找到了理论上可以工作的代码之后,我也遇到了类似的问题。问题在于boost::filesystem::path数据类型会去掉字符串的最后一个字符
我正在读取一个文件,路径是“c:\one\two\three”。但当我将其设置为路径数据类型时,字符串被更改为“c:\one\two\thre”。不知道那是什么,但是由于这个原因,没有找到文件的位置。我所做的只是在末尾添加另一个“\”。这样,它将删除“\”而不是“e”
在那之后一切都很好。但如前所述,我不知道它为什么这样做。希望这对别人有帮助 任何关于如何修复代码的建议(仍然使用BOOST_FOREACH)?您需要传递FOREACH可以迭代的内容,例如文件数组。否则不要使用FOREACH。
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
namespace fs = boost::filesystem;
fs::path targetDir("/tmp");
fs::directory_iterator it(targetDir), eod;
BOOST_FOREACH(fs::path const &p, std::make_pair(it, eod))
{
if(fs::is_regular_file(p))
{
// do something with p
}
}