C++ std::在main()中读取时向量内容会发生变化

C++ std::在main()中读取时向量内容会发生变化,c++,string,winapi,vector,C++,String,Winapi,Vector,我编写此函数是为了搜索计算机中的文件,但遇到了一个问题:当我读取搜索过程中找到的文件时(使用main()中的for循环),目录被破坏。 通过一些调试,我发现当我把它们放入file_found vector中时,它们是完整的,但是当我在主体中读取向量时,它们就像重叠的一样,并且在末尾有一个“*”。我如何修复这个问题 #include <stdio.h> #include <vector> #include <Windows.h>

我编写此函数是为了搜索计算机中的文件,但遇到了一个问题:当我读取搜索过程中找到的文件时(使用main()中的for循环),目录被破坏。 通过一些调试,我发现当我把它们放入file_found 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));
        }
    }
}
#包括
#包括
#包括
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字符A
std::vector
是一个
std::vector
(因为
LPWSTR
wchar\u t*
的类型定义)

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

<>最简单的方法是使用C++类字符串类,如<强> >代码> STD::WString <强>,而不是原始<代码> WCARAYT*< /COD>指针。
因此,您可以将
向量
替换为
向量
。在这种情况下,字符串的生存期将由C++编译器和STL实现自动管理:您可以将焦点放在算法的核心上,而不是在易于出现bug的字符串内存管理实现细节上。所以最后一次写入
dir
是向量的所有元素所指向的。只需使用<代码> STD::vector < /COD>而不是所有的字符串复制。这里没有理由使用<代码> MalOC (并且应该在C++中使用<代码>新< /COD> >代替<代码> MalOC/ >但更喜欢智能指针)。code>std::string不正确,因为它们需要宽字符(
std::WSString
)。谢谢,我有点忘了Hanks!你的回答加上在文件中按下按钮(你找到了tmp而不是dir,算法工作得很好:)