C++ std::在main()中读取时向量内容会发生变化
我编写此函数是为了搜索计算机中的文件,但遇到了一个问题:当我读取搜索过程中找到的文件时(使用main()中的for循环),目录被破坏。 通过一些调试,我发现当我把它们放入file_found vector中时,它们是完整的,但是当我在主体中读取向量时,它们就像重叠的一样,并且在末尾有一个“*”。我如何修复这个问题C++ std::在main()中读取时向量内容会发生变化,c++,string,winapi,vector,C++,String,Winapi,Vector,我编写此函数是为了搜索计算机中的文件,但遇到了一个问题:当我读取搜索过程中找到的文件时(使用main()中的for循环),目录被破坏。 通过一些调试,我发现当我把它们放入file_found vector中时,它们是完整的,但是当我在主体中读取向量时,它们就像重叠的一样,并且在末尾有一个“*”。我如何修复这个问题 #include <stdio.h> #include <vector> #include <Windows.h>
#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));
}
}
}
#包括
#包括
#包括
int SearchForFileW(找到WCHAR*文件名、LPWSTR目录、std::vector和文件)
{
WIN32_FIND_DATAW winFindDataFirst;
HANDLE hFile=FindFirstFileW(dir,&winFindDataFirst);
如果(!wcscmp(winFindDataFirst.cFileName,fileName))
{
wchar_t tmp[MAX_PATH]={0};
_snwprintf(tmp,wcslen(dir)-wcslen(L“*”),dir);
wcscpy(主管,tmp);
wcscat(dir,winFindDataFirst.cFileName);
找到文件。向后推(dir);
}
while(true)
{
if(FindNextFileW(hFile,&winFindDataFirst)==0)
{
如果(GetLastError()==错误\u没有\u更多\u文件)
{
返回0;
}
其他的
{
返回-1;
}
}
如果(!wcscmp(winFindDataFirst.cFileName,L.“)||
!wcscmp(winFindDataFirst.cFileName,L.“.”)
{
继续;
}
else如果(!wcscmp(winFindDataFirst.cFileName,fileName))
{
wchar_t tmp[MAX_PATH]={0};
_snwprintf(tmp,wcslen(dir)-wcslen(L“*”),dir);
wcscpy(主管,tmp);
wcscat(dir,winFindDataFirst.cFileName);
找到文件。向后推(dir);
}
if((winFindDataFirst.dwFileAttributes&FILE\u ATTRIBUTE\u目录)==FILE\u ATTRIBUTE\u目录)
{
wchar_t tmp[MAX_PATH]={0};
_snwprintf(tmp,wcslen(dir)-wcslen(L“*”),dir);
wcscpy(主管,tmp);
wcscat(dir,winFindDataFirst.cFileName);
wcscat(目录,L“\\*”);
SearchForFileW(文件名、目录、找到的文件);
_snwprintf(tmp,wcslen(dir)-(wcslen(winFindDataFirst.cFileName)+wcslen(L“\\*”),dir);
wcscpy(主管,tmp);
wcscat(目录,L“*”);
}
其他的
{
printf(“文件:----%S\n\n”,winFindDataFirst.cFileName);
}
}
返回0;
}
int main()
{
std::矢量文件;
WCHAR dirBuff[MAX_PATH]={0};
wcscpy(dirBuff,L“c:\\*”);
SearchForFileW(L“MyFile.txt”,dirBuff,file);
如果(file.size()==0)
{
printf(“未找到文件”);
}
其他的
{
对于(int i=0;i
LPWSTR
只是某种碳的糖衣*,这意味着它是一个指针。这意味着vector
是指针向量。每次都使用相同的缓冲区将文件名保存在(dir
)。所以你每次复制你的文件名,把它的地址推到你的向量上
要修复,请使用std::vector
或者用艰难的方法:对找到的每个文件使用malloc(strlen(tmp)+1)
为字符串分配数据。但是请注意,我相信LPWSTR代表长指针宽字符串。这意味着正常的strlen可能无法工作,因为它可能包含特殊的非ascii字符Astd::vector
是一个std::vector
(因为LPWSTR
是wchar\u t*
的类型定义)
现在,拥有原始指针的向量是非常脆弱的。您可以有一个原始观察指针向量,当您使用这些指针引用它们时,必须确保指向的字符串仍然被分配(有点“活动”)。
这不是你的情况
<>最简单的方法是使用C++类字符串类,如<强> >代码> STD::WString <强>,而不是原始<代码> WCARAYT*< /COD>指针。
因此,您可以将
向量
替换为向量
。在这种情况下,字符串的生存期将由C++编译器和STL实现自动管理:您可以将焦点放在算法的核心上,而不是在易于出现bug的字符串内存管理实现细节上。所以最后一次写入dir
是向量的所有元素所指向的。只需使用<代码> STD::vector < /COD>而不是所有的字符串复制。这里没有理由使用<代码> MalOC (并且应该在C++中使用<代码>新< /COD> >代替<代码> MalOC/std::WSString
)。谢谢,我有点忘了Hanks!你的回答加上在文件中按下按钮(你找到了tmp而不是dir,算法工作得很好:)