2017-04-10 26 views
2

我嘗試使用(使用GetCurrentDirectory)的Win32 API作爲char陣列... 獲得當前目錄,但下面的代碼打印件的當前目錄的名稱:004FF56C如何使用<windows.h> C++

TCHAR NPath[MAX_PATH]; 
GetCurrentDirectory(MAX_PATH, NPath); 
std::cout << NPath << endl; 

什麼這個代碼中的問題是什麼?

+3

我懷疑你已經定義了'UNICODE'宏。嘗試使用'std :: wcout'代替。 –

+0

哇,謝謝! 但如果我想仍然使用常規的std :: cout我該怎麼辦? –

+1

@Ruslan Ver你需要在visual studio中更改設置以不使用UNICODE,轉到項目屬性和第一頁,將'Use Unicode Character Set'更改爲'Not Set' – Raxvan

回答

3

問題是,默認情況下,Visual Studio項目對所有Win32 API函數都使用UNICODE。這意味着TCHAR映射到wchar_t而不是char,因此所有基於TCHAR的字符串都被視爲wchar_t[]而不是char[]

  1. 對此的一個解決方案是使用std::wcout來輸出Unicode字符串。

  2. 您可以更改項目設置,默認情況下不使用Unicode,前往Project Properties - >General - >Character set,並更改到不設置。這告訴編譯器將TCHAR映射到char而不是wchar_t

  3. 您可以使用WideCharToMultiByte()std::wcstombs()將Unicode字符串從wchar_t[]轉換爲char[]。您可以直接致電GetCurrentDirectoryA()

    char NPath[MAX_PATH]; 
    GetCurrentDirectoryA(MAX_PATH, NPath); 
    std::cout << NPath << endl; 
    

現在回到爲什麼YOUT得到004FF56C或其他一些隨機數,它有,如果你看看與std::cout實施做docs你看這個操作符:

template< class CharT, class Traits > 
basic_ostream<CharT,Traits>& operator<<(basic_ostream<CharT,Traits>& os, 
            const CharT* s); 

那裏CharTchar對於std::coutwchar_t對於std::wcout。如果您在使用不匹配的char/wchar_tcout/wcoutanother operator被稱爲(一個打印指針值),而不是打印文本的一個:

basic_ostream& operator<<(const void* value);