我想列出当前目录的所有文件,所以我有这段代码:
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
有人能帮助我吗?
答案 0 :(得分:4)
The WIN32_FIND_DATA
structure's member cFileName
is a TCHAR[N]
和TCHAR
is a Windows type alias that maps either to char
or 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
。
需要考虑的事情。
答案 1 :(得分:3)
您正在使用std::cout
输出宽字符字符串。请改用std::wcout
。
答案 2 :(得分:1)
我希望你有一个Unicode / ANSI不匹配。要打印Unicode字符串,请使用std::wcout