0

我还没有编写这个代码,因为我不确定哪个是解决这个问题的最佳方法。

对于初学者,程序现在所做的只是将与程序位于同一目录中的所有文件的名称放入一个字符串数组中,然后将该数组打印出来。

我想要做的是按文件扩展名对这些进行排序。将有一个特定扩展名列表供用户选择,之后文件夹中具有该扩展名的所有文件都将返回给用户。

我只是不知道该怎么做。首先想到的是遍历向量并将每个字符串与另一个具有所需扩展名的字符串进行比较,如果匹配,则将该字符串推入另一个特定于该文件扩展名的向量中。我只需要 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 );
}
4

1 回答 1

1

您的意思不是“排序”,而是“过滤”。排序意味着完全不同的东西。

您的第二个选项似乎是最好的,为什么要使用两个向量进行额外的工作?

至于比较,困难在于你要找的东西在字符串的末尾,而大多数搜索函数都是从字符串的开头操作的。但是在 C++ 中有一个方便的东西叫做反向迭代器,它从结尾向后扫描字符串,而不是从开头向前扫描。您调用rbegin()andrend()来获取字符串的反向迭代器。这是一个使用反向迭代器的比较函数。

#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());
}
于 2012-11-04T09:22:05.663 回答