18

boost::filesystem と BOOST_FOREACH を使用して、ディレクトリ内のすべてのファイルを反復処理できますか? 私は試した

path dirPath = ...
int fileCount = 0;
BOOST_FOREACH(const path& filePath, dirPath)
    if(is_regular_file(filePath))
        ++fileCount;

このコードはコンパイルおよび実行されますが、目的の結果が得られません。

4

3 に答える 3

32

BOOST_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
    } 
}
于 2012-01-04T10:57:03.947 に答える
0

あなたdirPathはシーケンスではないか、シーケンスのサイズが1です。

http://www.boost.org/doc/libs/1_48_0/doc/html/foreach.html

BOOST_FOREACH はシーケンスを繰り返します。しかし、正確にシーケンスと見なされるのは何ですか? BOOST_FOREACH は Boost.Range の上に構築されているため、Boost.Range がシーケンスとして認識するタイプを自動的にサポートします。具体的には、BOOST_FOREACH は、Single Pass Range Concept を満たす型で機能します。たとえば、次のように BOOST_FOREACH を使用できます。

  • STLコンテナ
  • 配列
  • ヌル終了文字列 (char および wchar_t)
  • std::イテレータのペア


STL コンテナーのサポートは非​​常に一般的です。STL コンテナーのように見えるものはすべてカウントされます。ネストされた iterator および const_iterator 型と begin() および end() メンバー関数がある場合、BOOST_FOREACH はそれを反復する方法を自動的に認識します。このようにして、boost::iterator_range<> と boost::sub_range<> が BOOST_FOREACH で機能します。

于 2012-01-04T10:36:39.297 に答える