1

次のコードが与えられました。

int _tmain(int argc, _TCHAR* argv[]) {
    _finddata_t dirEntry;
    intptr_t dirHandle;
    dirHandle = _findfirst("C:/*", &dirEntry);
    int res = (int)dirHandle;
    while(res != -1) {
        cout << dirEntry.name << endl;
        res = _findnext(dirHandle, &dirEntry);
    }
    _findclose(dirHandle);
    cin.get();
   return (0);
}

これが行うことは、指定されたディレクトリ (C:) に含まれるすべての名前を出力することです。ここで、サブディレクトリ (存在する場合) 内のすべての名前も出力する必要があります。私はこれまでのところこれを持っています:

int _tmain(int argc, _TCHAR* argv[]) {
    _finddata_t dirEntry;
    intptr_t dirHandle;
    dirHandle = _findfirst(argv[1], &dirEntry);
    vector<string> dirArray;
    int res = (int)dirHandle;
    unsigned int attribT;
    while (res != -1) {
        cout << dirEntry.name << endl;
        res = _findnext(dirHandle, &dirEntry);
        attribT = (dirEntry.attrib >> 4) & 1; //put the fifth bit into a temporary variable
//the fifth bit of attrib says if the current object that the _finddata instance contains is a folder.
        if (attribT) { //if it is indeed a folder, continue (has been tested and confirmed already)
            dirArray.push_back(dirEntry.name);
            cout << "Pass" << endl;
            //res = _findfirst(dirEntry.name, &dirEntry); //needs to get a variable which is the dirEntry.name combined with the directory specified in argv[1].
    }
}
_findclose(dirHandle);
std::cin.get();
return (0);

}

今、私は解決策全体を求めているわけではありません (私は自分でそれを実行できるようにしたいのです) が、TCHAR* argv である私の頭を理解できないことが 1 つだけあります。argv[1] には、「コマンド引数」の下のプロジェクト プロパティに入力したものが含まれていることを知っています。現在、これには、アプリケーションをテストするディレクトリ (C:/users/name/New folder/*) が含まれています。サブフォルダーを含むいくつかのフォルダーといくつかのランダムなファイル。argv[1] は現在、次のエラーを返します。

エラー: タイプ "_TCHAR*" の引数は、タイプ "const char *" のパラメーターと互換性がありません

今、私はTCHARをグーグルで検索しました.Unicode文字セットまたはマルチバイト文字セットの使用に応じて、wchar_t *またはchar *のいずれかであることがわかりました(現在Unicodeを使用しています)。また、変換が非常に苦痛であることも理解しています。だから私が求めているのは、_TCHAR と _findfirst パラメーターを使用してこれを回避するにはどうすればよいですか?

dirEntry.name を argv[1] に連結し、最後に「*」を連結し、これを別の _findfirst で使用することを計画しています。私はまだ C++ を学んでいるので、私のコードに対するコメントも大歓迎です。

4

2 に答える 2

2

こちらを参照してください: _findfirstはマルチバイト文字列_wfindfirst用で、ワイド文字用です。コードで TCHAR を使用する場合は_tfindfirst、非 UNICODE では _findfirst に解決され、UNICODE ビルドでは _wfindfirst に解決される (マクロ) を使用します。

また、_finddata_t の代わりに _tfinddata_t を使用します。これも、UNICODE 構成に応じて正しい構造に解決されます。

もう1つのことは、正しいリテラルも使用する必要があり、UNICODEビルドに_T("C:/*")なるなどです。UNICODE を定義してビルドしていることがわかっている場合は、 を使用してください。L"C:/*""C:/*"std::vector<std::wstring>

ところで。デフォルトでは、Visual Studio は UNICODE を使用してプロジェクトを作成します。UNICODE_wfindfirst以外のプロジェクトをビルドする正当な理由がないため、幅広いバージョンの関数のみを使用できます。

TCHAR であり、UTF-8 文字セットまたはマルチバイト文字セットの使用に応じて、wchar_t* または char* のいずれかであることを理解しています (現在 UTF-8 を使用しています)。

これは間違っています。UNICODE Windows API では UTF-16 を使用します。sizeof(wchar_t)==2.

于 2016-04-28T16:54:41.393 に答える
1

この単純な使用typedef

typedef std::basic_string<TCHAR> TCharString;

次に、次のように、使用TCharStringしていた場所で使用std::stringします。

vector<TCharString> dirArray;

std::basic_stringについては、こちらを参照してください。

于 2016-04-28T16:51:28.903 に答える