我使用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";
}
}
答案 0 :(得分:1)
如果FindFirstFile()
失败,则返回INVALID_HANDLE_VALUE
,而不是NULL
:
如果函数失败或无法从
lpFileName
参数中的搜索字符串中找到文件,则返回值为INVALID_HANDLE_VALUE
,lpFindFileData
的内容不确定。要获取扩展错误信息,请调用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)。