我还没有对此进行编码,因为我不确定哪种方法可以解决这个问题。
对于初学者来说,程序现在所做的只是将所有文件的名称放在与程序相同的目录中,然后将该数组打印出来。
我想要做的是按文件扩展名对它们进行排序。将有一个特定扩展名列表供用户选择,之后文件夹中具有该扩展名的所有文件都将返回给用户。
我只是不确定该怎么做。首先想到的是迭代向量并将每个字符串与具有所需扩展名的另一个字符串进行比较,如果匹配则将该字符串推送到另一个特定于该文件扩展名的向量中。我正在寻找的只有5个扩展,所以我不必为每个扩展创建一大堆新的向量。
Alternativley我认为从不填充原始向量也是有意义的,先取用户请求然后遍历文件并将具有匹配扩展名的所有文件推送到特定向量中。一旦完成,如果他们选择另一个选项,将简单地清除向量并使用新文件名重新填充。
关于如何进行实际比较的任何提示,我对c ++语法不是很好,使用不同类型的容器也是明智的吗?
非常感谢你们愿意提出的任何建议,非常感谢!
#include <iostream>
#include <filesystem>
#include <vector>
using namespace std;
using namespace std::tr2::sys;
void scan( path f, unsigned i = 0 )
{
string indent(i,'\t');
cout << indent << "Folder = " << system_complete(f) << endl;
directory_iterator d( f );
directory_iterator e;
vector<string>::iterator it1;
std::vector<string> fileNames;
for( ; d != e; ++d )
{
fileNames.push_back(d->path());
//print out conents without use of an array
/*cout << indent <<
d->path() << (is_directory( d->status() ) ? " [dir]":"") <<
endl;*/
//if I want to go into subdirectories
/*if( is_directory( d->status() ) )
scan( f / d->path(), i + 1 );*/
}
for(it1 = fileNames.begin(); it1 != fileNames.end(); it1++)
{
cout << *it1 << endl;
}
}
int main()
{
path folder = "..";
cout << folder << (is_directory( folder ) ? " [dir]":"") << endl;
scan( folder );
}
答案 0 :(得分:1)
你不是指'排序',你的意思是'过滤'。排序完全意味着其他东西。
你的第二种选择似乎是最好的,为什么额外使用两个向量?
至于比较,难点在于您要查找的内容位于字符串的末尾,并且大多数搜索函数都是从字符串的开头开始操作的。但是在C ++中有一个方便的东西,称为反向迭代器,它从末尾向后扫描字符串,而不是从开始向前扫描。您调用rbegin()
和rend()
来获取字符串的反向迭代器。这是使用反向迭代器的比较函数。
#include <algorithm>
#include <string>
// return true if file ends with ext, false otherwise
bool ends_with(const std::string& file, const std::string& ext)
{
return file.size() >= ext.size() && // file must be at least as long as ext
// check strings are equal starting at the end
std::equal(ext.rbegin(), ext.rend(), file.rbegin());
}