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

时间:2015-11-17 19:33:02

标签: c++ string pointers mfc filestreams

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

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

以下是一个例子:

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

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

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

我使用以下解除引用方法获得相同的行为(我期望 - 因为&gt;是同样的事情)。

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

对我做错了什么的想法?

2 个答案:

答案 0 :(得分:2)

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

wchar_t*

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

答案 1 :(得分:1)

尝试将CString投射到char指针:

file << (LPCTSTR)pClass->m_strEmployeeName;

请参阅:How to convert CString and ::std::string ::std::wstring to each other?

注意:这仅在您将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,则非常有用。