0

これに取り組むための最良の方法がわからないため、まだこのビットをコーディングしていません。

まず、プログラムが現在行っていることは、プログラムと同じディレクトリにあるすべてのファイルの名前を文字列の配列に入れ、その配列を出力するだけです。

私がやりたいのは、これらをファイル拡張子でソートすることです。ユーザーが選択できる特定の拡張子のリストが表示され、その後、フォルダー内のその拡張子を持つすべてのファイルがユーザーに返されます。

どうすればいいのかわかりません。最初に頭に浮かぶのは、ベクトルを反復処理し、各文字列を目的の拡張子を持つ別の文字列と比較し、一致する場合はその文字列をそのファイル拡張子に固有の別のベクトルにプッシュすることです。私が探している拡張機能は 5 つしかないので、拡張機能ごとに大量の新しいベクターを作成する必要はありません。

別の方法として、元のベクトルにデータを入力せず、最初にユーザーの要求を取得してから、ファイルを繰り返し処理し、一致する拡張子を持つすべてのファイルを特定のベクトルにプッシュすることも理にかなっているかもしれないと考えました。別のオプションを選択すると、ベクターは単純にクリアされ、新しいファイル名が再設定されます。

実際に比較を行う方法に関するヒントはありますか?私は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

「並べ替え」ではなく、「フィルター」を意味します。並べ替えは、まったく別の意味です。

2 番目のオプションが最善のようですが、なぜ 2 つのベクトルで余分な作業が行われるのでしょうか?

比較に関しては、探しているものが文字列の末尾にあり、ほとんどの検索機能が文字列の先頭から動作することが困難です。しかし、C++ には、文字列を最初から順方向ではなく、最後から逆方向にスキャンする逆反復子と呼ばれる便利なものがあります。文字列の逆反復子を取得するには、rbegin()andを呼び出します。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());
}
于 2012-11-04T09:22:05.663 に答える