c++, output of FindFirstFile()

c++, output of FindFirstFile()

本文关键字:FindFirstFile of output c++      更新时间:2023-10-16

我用FindFirstFile(...)函数编写了查找文件的程序。但是,当我尝试打印此函数的输出时,控制台窗口中打印了几个未知字符字符串。我读了一些帖子,有人写了尝试使用wcout而不是cout。我试过了,但无济于事。我认为,问题在于ANSI和UNICODE编码之间的差异。有人能帮我吗?我将非常感谢任何帮助!

这是我的代码:

#include "FindFile.h"
#include <iostream>
using namespace std;
void FindFileCl::Execute(Input * input, Response * response )
{
    WIN32_FIND_DATAA FindFileData;
    HANDLE h = FindFirstFileA((input->FileName).c_str(),    // name of the file
        &FindFileData);
    if (h)
    {   

        cout << "Search Results:n";
        cout<<(FindFileData.cFileName);

        CloseHandle(h);
    }
    else
    {
        cerr << "File is NOT found:" << GetLastError() << "n";
    }


} 

如果FindFirstFile()失败,则返回INVALID_HANDLE_VALUE,而不是NULL:

如果函数失败或无法从lpFileName参数中的搜索字符串中定位文件,则返回值为INVALID_HANDLE_VALUE,并且lpFindFileData的内容不确定。要获取扩展的错误信息,请调用GetLastError函数。

并且CCD_ 11是CCD_ 12d作为CCD_

#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)

意味着if (h)将被输入成功或失败。如果发生故障,cFileName将不会被修改,从而导致打印垃圾,因为它没有初始化。更改if条件以明确检查INVALID_HANDLE_VALUE:

if (h != INVALID_HANDLE_VALUE)
{
}

"最不坏"的方法之一是将Unicode名称转换为控制台的编码。

为此,我建议使用Unicode编译(Visual Studio中有一个项目选项>=8;否则您必须手动定义UNICODE_UNICODE),使用FindFirstFile()的TCHAR版本,然后使用CharToOem()或CharToOemBuff()(两者都不完美)或者,使用W版本,后跟WideCharToMultiByte(CP_OEMCP)。