我尝试编写返回字符串数组的函数(位于某个目录中的所有文件和文件夹)。代码如下。当我使用此代码输出信息到控制台(使用下面的编码代码)时它工作得很好,但是当我尝试返回指向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;
}
答案 0 :(得分: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奖金而给自己造成痛苦。我的方法不需要记住删除之后使用的内存,因为当它超出范围时将自动释放内存。我真的认为第一种方法更容易了。