以下代码
if(!cfile.Open(fileName, CFile::modeCreate | CFile::modeReadWrite)){
return;
}
ggg.Format(_T("0 \r\n"));
cfile.Write(ggg, ggg.GetLength());
ggg.Format(_T("SECTION \r\n"));
cfile.Write(ggg, ggg.GetLength()); 生成以下内容:0 SECTI
显然这是错误的:(a) \r\n被忽略,(b)字节被切断。
有人能告诉我我做错了什么吗?
在_T()中没有VC6的相同代码会产生正确的结果。
谢谢你。
发布于 2014-09-16 03:32:23
你有没有考虑过换行,比如:
cfile.Write(ggg, ggg.GetLength()); 到`
cfile.Write(ggg, ggg.GetLength() * sizeof(TCHAR))写需要字节数(而不是字符)。因为Unicode有两个字节宽,所以您需要说明这一点。sizeof of (TCHAR)应该是每个字符在给定平台上的字节数。如果它构建为Ansi,它将是1,Unicode将有2。乘以字符串长度和字节数应该是正确的。
有关TCHAR的信息可以在MSDN文档这里上找到。特别是,它被定义为:
_TCHAR数据类型是在Tchar.h中有条件定义的。如果为您的构建定义了符号_UNICODE,则_TCHAR定义为wchar_t;否则,对于单字节和MBCS构建,则将其定义为char。(wchar_t,基本的Unicode宽字符数据类型,是8位有符号字符字符的16位对应。)
TCHAR和_TCHAR在您的用法中应该是同义词。然而,我相信这些天微软建议包括<tchar.h>和使用_TCHAR。我不能告诉你的是,_TCHAR是否存在于VC6.0中。
如果使用上述方法--如果使用Unicode进行构建,则输出文件将位于Unicode中。如果您为Ansi构建,它将输出为8位ASCII。
希望CFile.write无论如何都能输出Ascii?读.
如果希望将所有文本作为8位ASCII写入文件,则必须使用其中一个宏进行转换。特别是CT2A。有关宏的更多信息可以在这个MSDN 文章中找到。每个宏都可以按名称进行细分,但是CT2A说根据链接处的图表将Generic character string (equivalent to W when _UNICODE is defined, equivalent to A otherwise)转换为Ascii。因此,不管是使用Unicode还是Ascii,它都会输出Ascii。您的代码应该类似于:
ggg.Format(_T("0 \r\n"));
cfile.Write(CT2A(ggg), ggg.GetLength());
ggg.Format(_T("SECTION \r\n"));
cfile.Write(CT2A(ggg), ggg.GetLength());由于宏将所有内容转换为Ascii的GetLength()就足够了。
发布于 2014-09-16 03:27:21
显然,您正在构建一个Unicode构建;CString (大概就是ggg )保存了一个wchar_t字符序列,每个字符都有两个字节大。ggg.GetLength()是以字符为单位的字符串的长度。
但是,CFile::Write的长度以字节为单位,而不是以字符为单位。您正在传递字符串实际占用的字节数的一半,因此只编写了一半的字符。
https://stackoverflow.com/questions/25860123
复制相似问题