FPrintf CString 只打印出第一个字母?

Posted

技术标签:

【中文标题】FPrintf CString 只打印出第一个字母?【英文标题】:FPrintf CString printing out only the first letter? 【发布时间】: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。 【参考方案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 projectL"Z:\\Projectцц";
FILE * pFile;
Win32xx::CString FileNameproject + 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 是一种反复试验的方法,直到你做对为止。

【讨论】:

以上是关于FPrintf CString 只打印出第一个字母?的主要内容,如果未能解决你的问题,请参考以下文章

读取文件,但只插入文件中的最后一个字符串

获取以某些字母开头的名称列表[关闭]

fprintf不打印Unicode字符[关闭]

idea 代码提示 点出第一个字母闪一下提示就消失

C++ 每个单词的首字母必须大写

Python - 如何在字符串中查找一个单词,然后只打印 x 个字母