gpt4 book ai didi

c++ - std::vector 内容在 main() 内部读取时发生变化

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:04 25 4
gpt4 key购买 nike

我正在编写此函数来搜索计算机内的文件,但我遇到了一个问题:当我读取在搜索过程中找到的文件时(使用 main() 中的 for 循环),目录被破坏了。通过一些调试,我看到当被插入 file_found vector 时,它们是完整的,但是当我读取主要的 vector 时,它们就像重叠并且末尾有一个“*”。我该如何解决这个问题?

    #include <stdio.h>
#include <vector>
#include <Windows.h>

int SearchForFileW(WCHAR * fileName,LPWSTR dir,std::vector<LPWSTR>& file_found)
{
WIN32_FIND_DATAW winFindDataFirst;

HANDLE hFile = FindFirstFileW(dir,&winFindDataFirst);

if (!wcscmp(winFindDataFirst.cFileName,fileName))
{
wchar_t tmp[MAX_PATH] = { 0 };
_snwprintf(tmp, wcslen(dir) - wcslen(L"*"), dir);
wcscpy(dir, tmp);
wcscat(dir, winFindDataFirst.cFileName);
file_found.push_back(dir);
}

while (true)
{
if (FindNextFileW(hFile, &winFindDataFirst) == 0)
{
if (GetLastError() == ERROR_NO_MORE_FILES)
{
return 0;
}
else
{
return -1;
}
}

if (!wcscmp(winFindDataFirst.cFileName, L".") ||
!wcscmp(winFindDataFirst.cFileName, L".."))
{
continue;
}
else if(!wcscmp(winFindDataFirst.cFileName,fileName))
{
wchar_t tmp[MAX_PATH] = { 0 };
_snwprintf(tmp, wcslen(dir) - wcslen(L"*"), dir);
wcscpy(dir, tmp);
wcscat(dir, winFindDataFirst.cFileName);
file_found.push_back(dir);
}

if ((winFindDataFirst.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
wchar_t tmp[MAX_PATH] = { 0 };
_snwprintf(tmp, wcslen(dir) - wcslen(L"*"), dir);
wcscpy(dir, tmp);
wcscat(dir, winFindDataFirst.cFileName);
wcscat(dir, L"\\*");
SearchForFileW(fileName, dir,file_found);
_snwprintf(tmp, wcslen(dir) - (wcslen(winFindDataFirst.cFileName) + wcslen(L"\\*")), dir);
wcscpy(dir, tmp);
wcscat(dir, L"*");
}
else
{
printf("File:-------%S\n\n", winFindDataFirst.cFileName);
}
}

return 0;
}

int main()
{
std::vector<LPWSTR> file;
WCHAR dirBuff[MAX_PATH] = {0};

wcscpy(dirBuff,L"c:\\*");
SearchForFileW(L"MyFile.txt", dirBuff,file);
if (file.size() == 0)
{
printf("No file found");
}
else
{
for (int i = 0; i < file.size(); i++)
{
printf("File found at: %S\n", file.at(i));
}
}
}

最佳答案

A std::vector<LPWSTR> std::vector<wchar_t*> (因为 LPWSTRwchar_t* 的类型定义)。

现在,拥有一个由原始拥有指针 组成的 vector 是非常脆弱的。您可以有一个原始观察 指针的 vector ,并且当您使用这些指针引用它们时,您必须确保指向的字符串仍然被分配(有点“活”)。这不是你的情况。

最简单的做法就是使用 C++ 字符串类,例如 std::wstring 而不是原始的 wchar_t*指针。
所以,你可以替换你的 vector<LPWSTR> vector<wstring> 。在这种情况下,字符串的生命周期将由 C++ 编译器和 STL 实现自动管理:您可以专注于算法的核心,而不是容易出错的字符串内存管理实现细节。

关于c++ - std::vector 内容在 main() 内部读取时发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30713919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com