C++ std::list的重定向<;CString>;将内容添加到文本文件

C++ std::list的重定向<;CString>;将内容添加到文本文件,c++,winapi,std,lpcstr,C++,Winapi,Std,Lpcstr,我正在使用该代码枚举驱动器中具有特定扩展名的文件,并将其写入文本文件。 它在文本文件中输出类似的内容。如何用文件名而不是这些垃圾值来写入文件地址。 00000281BBACF338 00000281BBACEA78 00000281BBAF108 00000281BBAD1E48 #include <Windows.h> #include <atlpath.h> #include <list> #include <iostream> #includ

我正在使用该代码枚举驱动器中具有特定扩展名的文件,并将其写入文本文件。 它在文本文件中输出类似的内容。如何用文件名而不是这些垃圾值来写入文件地址。 00000281BBACF338 00000281BBACEA78 00000281BBAF108 00000281BBAD1E48

#include <Windows.h>
#include <atlpath.h>
#include <list>
#include <iostream>
#include <fstream>

#ifdef _UNICODE
#define cout wcout
#endif

void FindFiles(
    const CString& strRootPath,
    const CString& strExt,
    std::list<CString>& listFiles,
    bool bRecursive = true)
{
    CString strFileToFind = strRootPath;
    ATLPath::Append(CStrBuf(strFileToFind, MAX_PATH), _T("*.*"));

    WIN32_FIND_DATA findData = { 0 };
    HANDLE hFileFind = ::FindFirstFile(strFileToFind, &findData);
    if (INVALID_HANDLE_VALUE != hFileFind)
    {
        do
        {
            CString strFileName = findData.cFileName;
            if ((strFileName == _T(".")) || (strFileName == _T("..")))
                continue;

            CString strFilePath = strRootPath;
            ATLPath::Append(CStrBuf(strFilePath, MAX_PATH), strFileName);
            if (bRecursive && (ATLPath::IsDirectory(strFilePath)))
            {
                FindFiles(strFilePath, strExt, listFiles);
            }
            else
            {
                CString strFoundExt = ATLPath::FindExtension(strFilePath);
                if (!strExt.CompareNoCase(strFoundExt))
                    listFiles.push_back(strFilePath);
            }

        } while (::FindNextFile(hFileFind, &findData));

        ::FindClose(hFileFind);
    }
}

int main()
{
    std::ofstream file;
    file.open("test.txt", std::ios::out | std::ios::app | std::ios::binary);

    std::list<CString> listFiles;
    FindFiles(_T("D:\\"), _T(".txt"), listFiles);
    for (const auto& strFile : listFiles)
        file << (LPCTSTR)strFile.GetString() << std::endl;
    return 0;
}

#包括
#包括
#包括
#包括
#包括
#ifdef_UNICODE
#定义coutwcout
#恩迪夫
空心翅片(
常数CString和strRootPath,
const CString&strExt,
std::列表和列表文件,
bool bRecursive=true)
{
CString strFileToFind=strRootPath;
ATLPath::Append(CStrBuf(strFileToFind,MAX_PATH),_T(“*”);
WIN32_FIND_DATA findData={0};
HANDLE hFileFind=::FindFirstFile(strFileToFind,&findData);
if(无效的句柄值!=hFileFind)
{
做
{
CString strFileName=findData.cFileName;
if((strFileName==_T(“.”)| |(strFileName==_T(“…”))
继续;
CString strFilePath=strRootPath;
ATLPath::Append(CStrBuf(strFilePath,MAX_PATH),strFileName);
if(bRecursive&(ATLPath::IsDirectory(strFilePath)))
{
FindFile(strFilePath、strExt、listFiles);
}
其他的
{
CString strFoundExt=ATLPath::FindExtension(strFilePath);
如果(!strExt.CompareNoCase(strFoundExt))
listFiles.push_back(strFilePath);
}
}while(::FindNextFile(hFileFind,&findData));
::FindClose(hFileFind);
}
}
int main()
{
流文件的std::of;
打开(“test.txt”,std::ios::out | std::ios::app | std::ios::binary);
列表文件;
FindFile(\u T(“D:\\”)、\u T(“.txt”)、列表文件);
用于(常量自动&strFile:listFiles)

文件您将
strfile
强制转换为
LPCTSTR
,并写入流的
文件流,这两个文件流的字符集不匹配

您可以使用
wofstream
解决此问题:

std::wofstream file;
或者使用
CT2A
功能对其进行转换:

for (const auto& strFile : listFiles)
    file << CT2A(strFile) << std::endl;
for(常量自动&strFile:listFiles)
文件