2017-10-24 14 views
-1

正規表現 '* bla.foo'に相当するものが必要です。つまり、C++でbla.fooで終わるファイルを取得してください。wordで終わるファイルを見つけてください。

#define BOOST_FILESYSTEM_VERSION 3 
#define BOOST_FILESYSTEM_NO_DEPRECATED 
#include <boost/filesystem.hpp> 
#include <boost/algorithm/string/predicate.hpp> 

    void get_all(const fs::path& root, const std::string& ext, std::vector<fs::path>& ret) 
{ 
    if(!fs::exists(root) || !fs::is_directory(root)) return; 

    fs::recursive_directory_iterator it(root); 
    fs::recursive_directory_iterator endit; 

    while(it != endit) 
    { 

     if(fs::is_regular_file(*it) && boost::algorithm::ends_with(it->path().filename(), ext)) ret.push_back(it->path().filename()); 
     ++it; 

    } 

} 

が、私は、エラーを取得しています:

何私がこれまでに思い付いたことである

namespace boost { 
    namespace algorithm { 

     // is_equal functor -----------------------------------------------// 

     //! is_equal functor 
     /*! 
      Standard STL equal_to only handle comparison between arguments 
      of the same type. This is a less restrictive version which wraps operator ==. 
     */ 
     struct is_equal 
     { 
      //! Function operator 
      /*! 
       Compare two operands for equality 
      */ 
      template< typename T1, typename T2 > 
       bool operator()(const T1& Arg1, const T2& Arg2) const 
      { 
       return Arg1==Arg2; 
      } 
     }; 

エラー:

/usr/local/include/boost/algorithm/string/compare.hpp:43:28: 
Invalid operands to binary expression ('const boost::filesystem::path' and 'int') 

それは間違っているように思えます引数が関数に渡されると、どこが間違っているか知りたいと思います。これはC++の私の最初のコードです。

ありがとうございます!

答えて

1

あなたは文字列データを比較したい場合は、あなたのpathオブジェクトにstring()を呼び出す必要があります:

if (is_regular_file(*it) && boost::algorithm::ends_with(it->path().filename().string(), ext)) 
     ret.push_back(it->path().filename()); 
+0

おかげで、問題の一部は、私がどのようなファイル名()のリターンを知らなかったということでした。 ドキュメントを簡単に見つけることができるソースをお勧めしますか? – Tuni

関連する問題