1

我想列出当前目录的所有文件,所以我有这个代码:

int WLoader::listdir(void)
{
    WIN32_FIND_DATA data;
    std::wstring path(L"*");
    std::wstring *name;
    HANDLE hFile = FindFirstFile(path.c_str(), &data);

    if  (hFile == INVALID_HANDLE_VALUE)
       return (-1);

    while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES)
    {
        std::cout << data.cFileName << std::endl;
    }
    return (0);
}

由于未知原因,我的程序显示此结果:

0029F29C
0029F29C
0029F29C
0029F29C
0029F29C
0029F29C

有人能帮助我吗?

4

3 回答 3

4

WIN32_FIND_DATA结构的成员cFileNameTCHAR[N], 并且TCHAR是映射到char或的 Windows 类型别名wchar_t问题是,当您编写代码时,您不知道会是哪一个。

根据您的构建设置,您可以使用char*, 或wchar_t*; 一个应该与 一起使用,std::cout另一个必须与 一起使用std::wcout。但是你用的是哪一个?!

幸运的是,有一个宏可以在编译时找出正在使用的宏:

while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES) {
#ifdef UNICODE
   std::wcout << data.cFileName << std::endl;
#else
   std::cout << data.cFileName << std::endl;
#endif
}

如果您尝试将文件名分配给std::string/ ,您会发现同样的问题std::wstring。这就是您使用 Windows API 所获得的。:)


解决此问题的一种方法是为输出流和字符串定义宏。

因此,在程序顶部的某个地方:

#ifdef UNICODE
#define STDCOUT std::wcout
#define STDSTR  std::wstring
#else
#define STDCOUT std::cout
#define STDSTR  std::string
#endif

然后在您的功能中,您只需要:

while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES) {
   STDCOUT << data.cFileName << std::endl;
}

你可以STDSTR在其他地方使用。

需要考虑的事情。

于 2012-01-02T15:37:10.550 回答
3

std::cout用于输出宽字符串。改为使用std::wcout

于 2012-01-02T15:33:37.540 回答
1

我希望您有 Unicode/ANSI 不匹配。要打印 Unicode 字符串,请使用std::wcout

于 2012-01-02T15:35:35.843 回答