【问题标题】:Convert LPTSTR to string or char * to be written to a file将 LPTSTR 转换为要写入文件的字符串或 char *
【发布时间】:2010-07-20 07:46:20
【问题描述】:

我想将 LPTSTR 转换为字符串或 char * 以便能够使用 ofstream 将其写入文件。

有什么想法吗?

【问题讨论】:

标签: c++ winapi


【解决方案1】:

为此使用T2A 宏。

【讨论】:

    【解决方案2】:

    其他线程中提供的大多数解决方案都不必要地转换为过时的编码而不是 Unicode 编码。只需使用reinterpret_cast<const char*> 编写UTF-16 文件,或使用WideCharToMultiByte 转换为UTF-8。

    稍微偏离问题,现在使用LPTSTR 代替LPWSTR 没有多大意义,因为旧的9x 系列Windows 已完全过时且不受支持。只需在任何地方使用LPWSTR 和随附的“宽字符”(即UTF-16 代码单元)类型,如WCHARwchar_t

    这是一个(我希望)编写 UTF-16 或 UTF-32(后者在 Linux/OS X 上)的示例:

    #include <fstream>
    #include <string>
    
    int main() {
      std::ofstream stream("test.txt");  // better use L"test.txt" on Windows if possible
      std::wstring string = L"Test\n";
      stream.write(reinterpret_cast<const char*>(string.data()), string.size() * sizeof(wchar_t));
    }
    

    【讨论】:

    • TTBOMK,不能保证wofstream 会写 UTF-16。 IIRC,Dinkumware 实现将写入(和读取,FTM)UTF-8。
    • @sbi:是的,我已经在 Linux 上注意到了这一点。 C++ 流很糟糕。要可靠地编写UTF-16,您似乎确实需要使用ofstream 来防止C++ 的脑死字符转换,并使用reinterpret_cast。如果 Dinkumware 库使用 UTF-8,那很好,至少不是像 Windows-1252 这样完全疯狂的选择。
    【解决方案3】:

    IIUC,LPTSTTR 可能指向 char 字符串或 wchar_t 字符串,具体取决于预处理器指令。如果正确,那么您需要在 std::ofstreamstd::wofstream 之间切换,具体取决于该预处理器指令。
    看看 this answer。它处理控制台流之间的切换,具体取决于TCHAR,但该方案也很容易适应文件流。

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多