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

时间:2014-03-26 15:41:38

标签: c++ cstring printf

我想使用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"。为什么只打印出第一个字母,有没有办法解决它?

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

函数fprintf(FILE*, char*, ...)不知道项目应该具有什么类型。因此编译器会将类似转换的任何内容编译为void*。如果需要char*,则必须使用CString的GetBuffer()成员。

答案 3 :(得分:0)

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

CStringA projectA(project);

然后:

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

答案 4 :(得分:0)

尝试

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

答案 5 :(得分:0)

我现在没有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处理是一种试错法,直到你做对了。