只打印第一个字母

FPrintf CString printing out only the first letter?

本文关键字:第一个 打印      更新时间:2023-10-16

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

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"。为什么只有第一个字母被打印出来,我有办法解决这个问题吗?

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

fprintf(pFile, "Project Name: %s", project.GetBuffer());

函数fprintf(FILE*, char*, ...)不知道项目应该具有什么类型。因此,编译器将编译任何类似于强制转换为void*的内容。当你想要一个char*时,你必须使用CString的GetBuffer()成员。

这是因为CString在UNICODE中,所以要将ANSI文本写入文件,首先将其转换为多字节,即:

CStringA projectA(project);

然后:

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

Try

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

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

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是一种不断尝试的方法,直到你把它弄对为止。
相关文章: