c ++,FindFirstFile()的输出

时间:2013-08-20 11:07:25

标签: c++ winapi

我使用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";
    }




} 

2 个答案:

答案 0 :(得分:1)

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

  

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

INVALID_HANDLE_VALUE#define d为-1(位于 WinBase.h 中的宏):

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

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

if (h != INVALID_HANDLE_VALUE)
{
}

答案 1 :(得分:0)

其中一种“最不好”的方法是将Unicode名称转换为Console的编码。

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