gpt4 book ai didi

c++ - 使用 Write 成员将 CString 写入 CFile 时每个字符后为空

转载 作者:行者123 更新时间:2023-11-27 23:58:49 25 4
gpt4 key购买 nike

我目前正在研究 MFC 库 CFile 类,但在使用 Write 方法将数据写入文件时遇到了问题。当我将 char 数组作为参数传递时,它工作得很好:

char c[] = "Hello!"; 
int size = sizeof(c) / sizeof(c[0]);
myFile.Write(c, size)

写入文件的字符:

Hello!

但是当我尝试将 CString 对象作为参数传递时:

CString cS("Hello");
myFile.Write(cS, cS.GetLength());

我得到:

H e l

我也试过:

CString cS("Hello");
LPWSTR c = cS.GetBuffer();
myFile.Write(c, cS.GetLength());
cS.ReleaseBuffer();

但是输出和上面一样。是什么导致了这种转变?发生这种情况是因为文本以宽字符存储吗?

最佳答案

问题:

CFile::Write 的第二个参数是函数将从第一个参数(缓冲区)传输的字节数。您传递的是 cS.GetLength(),它更愿意传递字符串中的字符数,这与字符串本身可能包含的字节数不同。

解决方案:

你应该把将字符串写入文件的那一行改成这样:

myFile.Write(LPCTSTR(cS), cS.GetLength()*sizeof(TCHAR));

sizeof(TCHAR) 将根据您是为 Unicode 还是 MBCS 生成不同的数字。这是因为 TCHAR 对于 Unicode 构建定义为 wchar_t,对于 MBCS 构建定义为 char。因此,无论您是否为 Unicode 构建,将字符串的长度乘以 TCHAR 的大小总是等于字符串的字节数。

其他注意事项:

无论如何,您没有理由在这里调用 GetBuffer()ReleaseBuffer()

这一点不是主要的,但是 CFile::Write 函数将 const void * 作为它的第一个参数。因此,您应该将 CString 转换为 LPCTSTR(这会根据是否自动评估为 LPCWSTRLPCSTR您正在使用 Unicode 或 MBCS 进行构建)。

最后一件事:最好用 _T() 宏包装字符串文字,这样您就可以针对 Unicode 和 MBCS 进行编译,而无需更改代码。

应用所有更改,您的整个代码将如下所示:

CString cS(_T("Hello"));
myFile.Write(LPCTSTR(cS), cS.GetLength()*sizeof(TCHAR));

关于c++ - 使用 Write 成员将 CString 写入 CFile 时每个字符后为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40667141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com