我想使用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"。为什么只打印出第一个字母,有没有办法解决它?
答案 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处理是一种试错法,直到你做对了。