2013-08-20 29 views
0

我用FindFirstFile(...)函數編寫了查找文件的程序。但是,當我嘗試打印此功能的輸出時,控制檯窗口中會顯示幾串未知字符。 我看了一些帖子,寫的是試用wcout而不是cout。我嘗試了一下,但沒有幫助。我認爲,問題在於ANSI和UNICODE編碼之間的區別。有人能幫助我嗎?我會非常感謝任何幫助!C++,FindFirstFile的輸出()

這裏是我的代碼:

#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

嘗試使用'FindFirstFile'而不是'FindFirstFileA',並以Unicode編譯您的程序。在控制檯中使用'chcp 65001'將代碼頁更改爲UTF-8。 –

+0

謝謝你的回答,Nemanja Boric。我試圖使用FindFirstFile而不是FindFirstFileA,但隨後它會導致函數的第一個參數出現問題,所以我使用FindFirstFileA。 – Victor

+0

哦,您需要使用'WIN32_FIND_DATA'而不是'WIN32_FIND_DATAA'。 –

回答

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) 
{ 
} 
+0

非常感謝,hmjd!我按你所說的做了,而這些奇怪的字符沒有打印出來!一切都在工作!你幫了我很多!謝謝! – Victor

0

其中的「最不壞」的方式將Unicode名稱轉換爲控制檯的編碼。爲此,我建議使用Unicode(在Visual Studio中有一個項目選項> = 8;否則必須手動定義UNICODE_UNICODE),使用TCHAR版本的FindFirstFile(),然後使用CharToOem()或CharToOemBuff()(兩者都不完美)。 - 或者,使用W版本,然後使用WideCharToMultiByte(CP_OEMCP)。

+0

謝謝你的回答,Medinoc。 hmjd也回答了我的問題,我照他的說法做了,而且我的程序正常運行。非常感謝你的回答! – Victor