C++文件写入包括字符串的内存地址,而不是内容

C++ File Write includes the memory address of the string instead of the contents

本文关键字:地址 内存 文件 包括 字符串 C++      更新时间:2023-10-16

All,我还在学习C++但我在一个我正在修补的项目中遇到了一个问题,我很好奇。我注意到,当我尝试打印作为类成员的字符串的内容时,我得到的是内存地址而不是内容。 我知道这是因为该项目是一个指针,但我感到困惑的是我正在使用->运算符来尊重它。

为什么我可以使用 -> 运算符在 if 语句中计算类成员来取消引用它,但在以相同的方式打印到文件字符串时,我却会获取内存地址?

下面是一个示例:

假设我有一个名为 pClass 的类,其中包含一个名为 m_strEmployeeName 的成员。作为旁注(我不知道这是否重要(,m_strEmployeeName值是CString而不是std::string,因此可能也可能存在一些未知的转换问题。

如果我使用以下简单代码,我会得到一个内存地址。

std::ofstream file("testfile.text");
file << pClass->m_strEmployeeName;
file.close();

使用以下取消引用方法得到了相同的行为(我期望,因为 -> 是一回事(。

std::ofstream file("testfile.text");
file << (*pClass).m_strEmployeeName;
file.close();

知道我做错了什么吗?

这是因为您的CString类实际上是CStringW类包含wchar_t字符串std::ofstream因此不包含支持wchar_t*字符串的operator >>重载。要打印CStringW类对象,您可以使用这种类型的流std::wofstream它可以正确识别wchar_t*字符串并且输出是正确的。

std::wofstream file("testfile.text");
file << pClass->m_strEmployeeName;
file.close();

您也可以在多字节字符支持中创建程序。可以在项目设置中指定它。但我建议你继续使用UNICODE。

尝试将CString转换为char指针:

file << (LPCTSTR)pClass->m_strEmployeeName;

请参阅: 如何将 CString 和 ::std::string ::std::wstring 相互转换?

注意:仅当您将 TCHAR 定义为 8 位时,这才有效。 如果您使用的是 16 位 UNICODE TCHAR,则还会进行一次转换。

以下是进行TCHAR转换的一种方法:

char c_str[1000];
size_t ret;    
wcstombs_s(
   &ret,
   c_str,
   sizeof(c_str),
   (LPCTSTR)pClass->m_strEmployeeName,
   pClass->m_strEmployeeName.GetLength()
);
std::ofstream file("testfile.text");
file << c_str;
file.close();

如果您需要 8 位 ASCII 文件,但可以使用 UNICODE CString,则很有用。