0

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




} 
4

2 回答 2

1

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

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

并且INVALID_HANDLE_VALUE#defined -1(跟随位于WinBase.h中的宏):

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

这意味着if (h)将输入成功或失败。在失败的情况下,cFileName不会被修改导致打印垃圾,因为它没有初始化。更改if条件以明确检查INVALID_HANDLE_VALUE

if (h != INVALID_HANDLE_VALUE)
{
}
于 2013-08-20T11:19:59.497 回答
0

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

为此,我建议使用 FindFirstFile() 的 TCHAR 版本,UNICODE然后_UNICODE使用 CharToOem() 或CharToOemBuff( )(两者都不完美)。-- 或者,使用 W 版本,后跟 WideCharToMultiByte(CP_OEMCP)。

于 2013-08-20T11:21:30.250 回答