1

我尝试编写返回字符串数组的函数(位于某个目录中的所有文件和文件夹)。代码如下。当我使用此代码将信息输出到控制台时(使用下面的注释代码),它工作得很好,但是当我尝试返回指向指针的指针时,wchar_t我获得了每个元素都等于 enother 的数组(所有元素都相同)。我做错了什么?

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;
}

您还需要更改 PathCreator 中的相应代码以使用 std::wstring。

编辑:如果您真的不会使用 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 回答