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 只打印出第一个字母?的主要内容,如果未能解决你的问题,请参考以下文章