2011-04-07 39 views
1

Ive有一個看看這篇文章:Find if string ends with another string in C++比較兩個字符串,以排除基於extention

我試圖實現類似的目標。

基本上我想從一個目錄中取出一個文件列表,並過濾掉任何不以指定的允許擴展名結束的文件,以便在我的程序中進行處理。

在java中,這將通過創建一個方法並將擴展字符串作爲字符串傳遞,然後在以下語句中使用.endswith來執行。 C++似乎不支持這個,所以我該如何去解決它?

for (int fileList = 0; fileList < files.length; fileList++) 
    { 
     //output only jpg files, file list is still full 
     if(files[fileList].toString().endsWith(extension)) 
     { 
      images.add(files[fileList]); 
     }//end if 
    }//end for 

在此先感謝

回答

2
bool endsWith(std::string const & s, std::string const & e) { 
    if (s.size() < e.size()) 
     return false; 
    return s.substr(s.size() - e.size()) == e; 
} 
+0

會不會只是檢查擴展是否是相同的長度。我需要根據實際的擴展名排除,例如.pdf或.doc – Chriss 2011-04-07 14:28:36

+0

note - 'e'需要包含「。」,否則匹配「ml」文件的嘗試也將匹配「html」。 – AShelly 2011-04-07 14:29:15

+0

@chriss,最後一行是將字符串中最後一個'e.size()'字符與'e'進行比較。 – AShelly 2011-04-07 14:30:11

1

如果使用boost ::文件系統是OK的你,那麼你可以嘗試

#include <boost/filesystem.hpp> 
//... 

boost::filesystem::path dir_path ("c:\\dir\\subdir\\data"); 
std::string extension(".jpg"); 
for (boost::filesystem::directory_iterator it_file(dir_path); 
    it_file != boost::filesystem::directory_iterator(); 
    ++it_file) 
{ 
    if (boost::filesystem::is_regular_file(*it_file) && 
     boost::filesystem::extension(*it_file) == extension) 
    { 
    // do your stuff 
    } 
} 

這將解析指定目錄路徑,然後你就必須以過濾所需的擴展名.t

0

下一個示例檢查文件名是否以jpg擴展名結尾:

#include <iostream> 
#include <string> 
using namespace std; 


bool EndsWithExtension (const string& str,const string &extension) 
{ 
    size_t found = str.find_last_of("."); 
    if (string::npos != found) 
    { 
     return (extension == str.substr(found+1)); 
    } 

    return false; 
} 

int main() 
{ 
    string filename1 ("c:\\windows\\winhelp.exe"); 
    string filename2 ("c:\\windows\\other.jpg"); 
    string filename3 ("c:\\windows\\winhelp."); 

    cout << boolalpha << EndsWithExtension(filename1,"jpg") << endl; 
    cout << boolalpha << EndsWithExtension(filename2,"jpg") << endl; 
    cout << boolalpha << EndsWithExtension(filename3,"jpg") << endl; 
} 
+0

好的。非常感謝你。只是爲了澄清,所以我明白這是如何工作;該方法在傳遞的字符串中查找「。」如果它找到它,然後在「」之後查看剩餘的字符「found + 1」。查看是否有匹配的「expectedExtentsion」 – Chriss 2011-04-07 14:39:52

+0

@Chriss Right。它找到點的位置。如果找到了點,則假定其餘的是文件擴展名。如果點位置的子字符串與預期的擴展名匹配,則返回true.Otherwise false – 2011-04-07 14:41:42

+0

ok。非常感謝你的解釋,這對我有很大的幫助! – Chriss 2011-04-07 14:56:52