C++ 在c++;窗下

C++ 在c++;窗下,c++,c,windows,directory,listings,C++,C,Windows,Directory,Listings,我想列出当前目录的所有文件,因此我有以下代码: 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)

我想列出当前目录的所有文件,因此我有以下代码:

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);
}

有人能帮我吗?

您正在使用
std::cout
输出一个宽字符串。改为使用
std::wcout

您正在使用
std::cout
输出宽字符串。改用
std::wcout

我认为您的Unicode/ANSI不匹配。要打印Unicode字符串,请使用
std::wcout

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

,问题是,在编写代码时,您不知道该字符串是哪一个

根据构建设置,您可以使用
char*
,也可以使用
wchar\u 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
}
那么在你的功能中,你所需要的就是:

while(FindNextFile(hFile, &data) != 0 || GetLastError() != ERROR_NO_MORE_FILES) {
   STDCOUT << data.cFileName << std::endl;
}
while(FindNextFile(hFile,&data)!=0 | | | GetLastError()!=ERROR_NO_MORE_文件){
STDCOUT,问题是,在编写代码时,您不知道它将是哪一个

根据您的构建设置,您可以使用
char*
,也可以使用
wchar\u 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
}
那么在你的功能中,你所需要的就是:

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

STDCOUT它似乎输出的是cFileName元素的地址指针,而不是它包含的字符串。您是否尝试只使用printf()相反?是的,它与printf一起工作,但我需要将cFileName转换成字符串,因为我需要它来打开dll。所以我认为如果我不能将正确的文件名写入字符串,我就不能将正确的名称转换成字符串。@NickShaw:这是一个糟糕的主意。显然,他试图流式处理的内容有问题;只有可能恢复到石器时代掩盖了这个问题,可能会使问题变得更糟。它似乎在输出cFileName元素的地址指针,而不是它包含的字符串。您是否尝试过使用printf()相反?是的,它与printf一起工作,但我需要将cFileName转换成字符串,因为我需要它来打开dll。所以我认为如果我不能将正确的文件名写入字符串,我就不能将正确的名称转换成字符串。@NickShaw:这是一个糟糕的主意。显然,他试图流式处理的内容有问题;只有可能恢复到石器时代掩盖了这个问题,可能会使问题变得更糟。如果我想将cFileName放入字符串中?@Yumino您已经在使用
std::wstring
作为路径,请继续使用它。@DavidHeffernan:然后当他关闭
UNICODE
时,他又遇到了同样的问题。@TomalakGeret'kal在Windows编程
UNICODE
中就是这样方法是打开然后再也不关闭。尝试编写使用
UNICODE
的代码,无论是打开还是关闭,都会让生活变得不必要的困难。@David:我想如果你的代码包含一个抽象层以便于以后的可移植性,那就更合适了。这个OP的代码的可能性很小。当然,这还是值得他知道的?如果我想是否将cFileName转换为字符串?@Yumino您已经在使用
std::wstring
作为路径,继续使用它。@DavidHeffernan:然后当他关闭
UNICODE
时,他又遇到了同样的问题。@TomalakGeret'kal在Windows编程
UNICODE
中是一种您打开然后再也不会关闭的东西。尝试编写使用
UNICODE
的代码无论是开还是关都会让生活变得不必要的困难。@David:我想如果你的代码包含一个抽象层以便于以后的移植,那就更合适了。这篇OP的代码的可能性很小。不过,肯定值得他知道吗?