代码之家  ›  专栏  ›  技术社区  ›  Arkanipro MA

WIN32\u FIND\u DATA FileNAme不输出文件名,而是输出十六进制代码[重复]

  •  -1
  • Arkanipro MA  · 技术社区  · 7 年前

    我试图获取文件夹中所有文件的完整列表,如下所示:

    #include<Windows.h>
    #include<iostream>
    #include<stdio.h>
    
    using namespace std;
    
    void main()
    {
    HANDLE dateiHandle;
    WIN32_FIND_DATA wfindD;
    
    dateiHandle = FindFirstFile(L"E:\\Roman\\PIC\\funpics\\*", &wfindD);
    do
    {
        cout << wfindD.cFileName << endl;
    } while (FindNextFile(dateiHandle, &wfindD));
    
    FindClose(dateiHandle);
    while (1)
    {
    
    }
    }
    

    我不明白为什么结果是这样的:

    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    00AFFCCC
    
    2 回复  |  直到 7 年前
        1
  •  7
  •   Miles Budnek    7 年前

    TCHAR 将键入 wchar_t 如果在项目中启用了unicode支持(Visual Studio的默认最新版本)。 std::cout 没有任何特殊处理 wchar_t* 然后回到 void* 过载 operator<< ,它只打印作为十六进制数指向的内存地址。使用 std::wcout 相反 操作员(<)< 过载 wchar\u t* ,并将按预期打印字符串。

    另一方面,如果总是显式地为处理字符串的Win32函数和结构使用a(代表ANSI)或W(代表wide)名称,那么您就不会感到意外了。为了支持非ascii字符串,通常最好使用W版本。在这种情况下, FindFirstFileW ,则, FindNextFileW WIN32_FIND_DATAW FindClose 不直接与字符串交互,因此没有A或W版本。

        2
  •  1
  •   Remy Lebeau    7 年前

    使用 std::wcout 而不是 std::cout 你会看到正确的名字被打印出来。 1.

    你的应用程序是为Unicode编译的,所以你真的在调用 FindFirstFileW() ,它修改了 WIN32_FIND_DATAW 结构,其 cFileName 成员是类型 WCHAR[] ,这是一个双字节“宽”字符串。

    1. 尽管如此,如果文件名确实包含双字节字符(超过255个),例如日语,那么您可能需要调整命令提示符中的其他设置,以正确查看双字节字符。