我遇到了矢量的问题,我试图解决它已经有一段时间了。我将立即发布代码然后解释它。
#include "filesystem.h"
#include <vector>
using namespace Filesystem;
wchar_t** Path::ListDir()
{
/*struct dirEntry
{
wchar_t entry[MAX_PATH];
};*/
vector<wchar_t*> pathList = vector<wchar_t*>();
WIN32_FIND_DATA findData;
HANDLE dirHandle = new HANDLE;
wchar_t* path = L"C:\\*";
dirHandle = FindFirstFile(path, &findData);
if (dirHandle == INVALID_HANDLE_VALUE)
return NULL;
while (FindNextFile(dirHandle, &findData) != 0)
{
pathList.push_back(findData.cFileName);
}
FindClose(dirHandle);
return NULL;
}
这是我正在编码的文件系统类的一部分。它应该列出目录中的所有文件,并将它们作为二维字符串数组返回。如果我这样做,它会填充列表,最后一个文件乘以文件夹中的文件数。这不是我想要的。我认为可能是因为我发送了一个指向push_back的指针,但我还没有找到解决方法。我在windows上编码,顺便说一句。
如果这里有人知道如何做到这一点会很好。
答案 0 :(得分:1)
在你的解决方案中,向量中的每个指针都是相同的,并指向最后一个cString(它大致指向堆栈上的findData实例)。在调用FindNextFile()后,您必须复制其结果。尝试类似的东西:
std::vector<std::wstring> pathList;
//...
{
pathList.push_back(std::wstring(findData.cFileName));
}
没有自己编译。但是你在这里有一个粗略的想法。
答案 1 :(得分:1)
您将findData.cFileName
的地址存储在vector
N次。
您需要复制此内容。可能使用:
vector<std::wstring> pathList;
编辑:其他小问题:
vector<wchar_t*> pathList = vector<wchar_t*>();
HANDLE dirHandle = new HANDLE;
可以替换为:
vector<wchar_t*> pathList;
HANDLE dirHandle;
如果你必须返回wchar_t**
然后(例如):
// '+1' for NULL terminating string as the callers needs
// know where the array ends.
wchar_t** result = new wchar_t*[pathList.size() + 1];
*(result + pathList.size()) = 0;
for (size_t i = 0; i < pathList.size(); i++)
{
wchar_t* name = new wchar_t[pathList[i].length() + 1];
std::copy(pathList[i].begin(), pathList[i].end(), name);
*(name + pathList[i].length()) = L'\0';
*(result + i) = name;
}
return result;
调用者必须记住delete[]
返回的数组:
Path p;
wchar_t** list = p.ListDir();
...
for (size_t i = 0; 0 != *(list + i); i++)
{
delete[] *(list + i);
}
delete[] list;
虽然这是C ++,但你应该使用std::vector<std::wstring>
。