【问题标题】:FPrintf CString printing out only the first letter?FPrintf CString 只打印出第一个字母?
【发布时间】:2014-03-26 15:41:38
【问题描述】:

我想用 fprintf 打印出一些 CStrings 以及更多的文本:

CString project = "Project";
FILE * pFile;
CString FileName = project + "_Stats.txt";
pFile = _wfopen(FileName, _T("w"));
fprintf(pFile, "Project Name: %s", project);

创建的文件名为“Project_Stats.txt”,输出应为“项目名称:项目”,但我得到“项目名称:P”。为什么只打印出第一个字母,有什么办法可以解决吗?

【问题讨论】:

  • 您的项目是否编译为 UNICODE?
  • @nvoigt:几乎可以肯定。 UTF-16 中 Unicode 的 ISO-8859-1 子集编码为 0000-0080,在大端系统上意味着第二个字节是 00。

标签: c++ cstring printf


【解决方案1】:

pm100 给出了正确答案,然后将其删除 - UNICODE CString 的正确代码是 %ls,而不是 %s。

【讨论】:

    【解决方案2】:
    fprintf(pFile, "Project Name: %s", project.GetBuffer());
    

    【讨论】:

      【解决方案3】:

      函数fprintf(FILE*, char*, ...) 不知道项目应该有什么类型。所以编译器将编译任何东西,比如转换为void*。当你想要 char* 时,你必须使用 CString 的 GetBuffer() 成员。

      【讨论】:

        【解决方案4】:

        发生这种情况是因为 CString 是 UNICODE 格式,因此要将 ANSI 文本写入文件首先将其转换为多字节,即:

        CStringA projectA(project);
        

        然后:

        fprintf(pFile, "Project Name: %s", projectA.GetString());
        

        【讨论】:

          【解决方案5】:

          试试

          fprintf(pFile, "Project Name: %s", (const char_t*)project);
          

          或

          fprintf(pFile, "Project Name: %s", (const wchar_t*)project);
          

          请参阅此主题以获取更多信息http://msdn.microsoft.com/en-us/library/72b2swax.aspx

          【讨论】:

            【解决方案6】:

            我现在没有 MFC,但在 Win32++ 中以下工作正常(我有 1252 代码页,所以俄语字符不在 1252 代码页中,cpp 文件也保存为带有 BOM 的 UTF-8):

            Win32xx::CString project{L"Z:\\Projectцц"};
            FILE * pFile;
            Win32xx::CString FileName{project + L"_Staпрпфts.txt"};
            pFile = _wfopen(FileName.GetBuffer(FileName.GetLength()), _T("w, ccs=UTF-16LE"));
            fwprintf(pFile, L"Project Name: %s", project.GetBuffer(project.GetLength()));
            

            注意不要在 Win32 中混合使用 Unicode 和 ANSI 方法。这也指字符串文字,使用 _T 宏或始终使项目 Unicode 并使用 L"" 作为字符串文字。
            也许习惯于像 boost::filesystem (将包含在下一个标准中)这样的文件路径处理和用于格式化的 C++ 流会更好。要记住的一件事是,在 Windows 中正确处理 Unicode 是一种反复试验的方法,直到你做对为止。

            【讨论】:

              猜你喜欢
              • 2019-11-17
              • 1970-01-01
              • 2015-08-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-09-29
              • 1970-01-01
              • 2021-05-11
              相关资源
              最近更新 更多