【问题标题】:How to get current directory name with <windows.h> C++如何使用 <windows.h> C++ 获取当前目录名称
【发布时间】:2017-09-05 15:00:11
【问题描述】:

我正在尝试使用 win32 api(使用GetCurrentDirectory)作为char 数组获取当前目录... 但打印以下代码:004FF56C

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

这段代码有什么问题?

【问题讨论】:

  • 我怀疑您定义了 UNICODE 宏。尝试改用std::wcout
  • @Ruslan Ver 您需要将设置更改为不使用UNICODE,在Visual Studio 中,转到项目属性和第一页,将Use Unicode Character Set 更改为Not Set
  • 您可以使用标准的wcstombs函数或WideCharToMultibyte Windows函数。
  • 更好的是,不要陷入使用微软可怕的TCHAR 宏的陷阱。它如何渗透到用户程序中令人不安,这是 Visual Studio 的错。
  • 或:char NPath[MAX_PATH]; GetCurrentDirectoryA(MAX_PATH, NPath);.

标签: c++ windows winapi directory


【解决方案1】:

问题在于默认情况下,Visual Studio 项目对所有 Win32 API 函数使用 UNICODE。这意味着TCHAR 映射到wchar_t 而不是char,因此所有基于TCHAR 的字符串都被视为wchar_t[] 而不是char[]

  1. 一种解决方案是使用std::wcout 输出Unicode 字符串。

  2. 您可以将项目设置更改为默认不使用 Unicode,方法是转到 Project Properties -> General -> Character set 并将其更改为 Not Set。这告诉编译器将TCHAR 映射到char 而不是wchar_t

  3. 您可以使用WideCharToMultiByte()std::wcstombs() 将Unicode 字符串从wchar_t[] 转换为char[]

  4. 您可以直接拨打GetCurrentDirectoryA()

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

现在回到为什么你会得到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/wcout,则会调用another operator(打印指针值的),而不是打印文本的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多