1

文字列の配列(あるディレクトリにあるすべてのファイルとフォルダー)を返す関数を作成しようとしました。コードは以下です。このコードをコンソールへの出力情報に使用すると(以下のコメント付きコードを使用)、うまく機能しますが、ポインターをポインターに戻そうとするとwchar_t、すべての要素が互いに等しい(すべての要素が同じ)配列を取得します。私は何を間違っていますか?

wchar_t path[SIZE];
    wchar_t *PathCreator(wchar_t *dir, wchar_t *fileName)
    {
        int j = 0;
        while(j < SIZE)
        {
            path[j] = '\0';
            j++;
        }
        int i;
        i = 0;
        while(*dir != '*' && *dir != '\0')
        {
            path[i] = *dir;
            i++;
            dir++;
        }
        wchar_t *t = fileName;  
        while(*t != '\0')
        {
            path[i] = *t;
            i++;
            t++;
        }
        path[i] = '\0';
        return path;
    }
wchar_t* allFlsArr[SIZE];
int i = 0;
wchar_t **GetAllFiles(wchar_t* dir)
{
    WIN32_FIND_DATA file;
    HANDLE search_hendle = FindFirstFile(dir, &file);
    if(search_hendle)
    {
        do
        {
            wchar_t *p = PathCreator(dir,file.cFileName);
            //std::wcout << p << std::endl;
            allFlsArr[i++] = p;
            std::wcout << i << std::endl;
        }
        while(FindNextFile(search_hendle, &file));
        allFlsArr[i] = '\0';
    }
    CloseHandle(search_hendle);
    return allFlsArr;
}
4

1 に答える 1

2

PathCreatorからの復帰にメモリを割り当てていないのではないかと思います。これは、すべてのエントリに同じポインタを設定することを意味します。ポインタの場所でデータを変更すると、データが変更され、すべてのエントリがそのデータを確認すると、すべてが「変更」されます。

std ::wstring..を使用する方がはるかに良いでしょう。

std::wstring PathCreator(const std::wstring& dir, wchar_t *fileName)
{
    return dir.substr( 0, dir.size() - 1 ) + fileName;
} 

std::vector< std::wstring > GetAllFiles( const std::wstring& dir)
{
    std::vector< std::wstring > allFlsArr;
    WIN32_FIND_DATA file;
    HANDLE search_handle = FindFirstFile(dir.c_str(), &file);
    if(search_handle)
    {
        do
        {
            std::wstring path = PathCreator(dir,file.cFileName);
            //std::wcout << path << std::endl;
            allFlsArr.push_back( path );
            std::wcout << i << std::endl;
        }
        while(FindNextFile(search_handle, &file));
    }
    CloseHandle(search_handle);
    return allFlsArr;
}

std :: wstringも使用するには、PathCreatorの対応するコードを変更する必要があります。

編集:実際にSTLを使用しない場合は、PathCreatorを変更して次のようなことを行う必要があります。

wchar_t *PathCreator(wchar_t *dir, wchar_t *fileName)
{
    wchar_t* path = new wchar_t[SIZE];
    int j = 0;
    while(j < SIZE)
    {
        path[j] = '\0';
        j++;
    }
    int i;
    i = 0;
    while(*dir != '*' && *dir != '\0')
    {
        path[i] = *dir;
        i++;
        dir++;
    }
    wchar_t *t = fileName;  
    while(*t != '\0')
    {
        path[i] = *t;
        i++;
        t++;
    }
    path[i] = '\0';
    return path;
}  

文字列を使い終わったら、文字列を削除することを忘れないでください[]。

ただし、実際には、STL関数とそれらが提供するRAIIボーナスを使用しないことで、自分自身に苦痛を与えています。私の方法では、後で使用されたメモリを削除することを覚えておく必要はありません。スコープから外れると、メモリが自動的に解放されるからです。

でも、最初の方法の方が簡単だと思います。

于 2012-10-15T13:41:26.593 に答える