C++ 文件写入包括字符串的内存地址而不是内容
C++ File Write includes the memory address of the string instead of the contents
全部,
我仍在学习 C++,但我在一个我正在修补的项目中遇到了一个我很好奇的问题。我注意到,当我尝试打印属于 class 的字符串的内容时,我得到的是内存地址而不是内容。我知道这是因为该项目是一个指针,但我感到困惑的是我正在使用 ->
运算符来引用它。
为什么我可以使用 ->
运算符在 if 语句中评估 class 成员以取消引用它,但是当以相同方式打印到文件字符串时,我得到的是内存地址?
示例如下:
假设我有一个名为 pClass 的 class 和一个名为 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
转换为 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
可以使用,则很有用。
这是因为你的 CString
class 实际上 CStringW
class 包含 wchar_t
字符串所以 std::ofstream
不包含 operator >>
支持 wchar_t*
字符串的重载。要打印 CStringW
class 对象,您可以使用这种类型的流 std::wofstream
它可以正确识别 wchar_t*
字符串并且输出是正确的。
std::wofstream file("testfile.text");
file << pClass->m_strEmployeeName;
file.close();
您还可以创建支持多字节字符的程序。它可以在您的项目设置中指定。但我建议你继续使用 UNICODE。
全部,
我仍在学习 C++,但我在一个我正在修补的项目中遇到了一个我很好奇的问题。我注意到,当我尝试打印属于 class 的字符串的内容时,我得到的是内存地址而不是内容。我知道这是因为该项目是一个指针,但我感到困惑的是我正在使用 ->
运算符来引用它。
为什么我可以使用 ->
运算符在 if 语句中评估 class 成员以取消引用它,但是当以相同方式打印到文件字符串时,我得到的是内存地址?
示例如下:
假设我有一个名为 pClass 的 class 和一个名为 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
转换为 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
可以使用,则很有用。
这是因为你的 CString
class 实际上 CStringW
class 包含 wchar_t
字符串所以 std::ofstream
不包含 operator >>
支持 wchar_t*
字符串的重载。要打印 CStringW
class 对象,您可以使用这种类型的流 std::wofstream
它可以正确识别 wchar_t*
字符串并且输出是正确的。
std::wofstream file("testfile.text");
file << pClass->m_strEmployeeName;
file.close();
您还可以创建支持多字节字符的程序。它可以在您的项目设置中指定。但我建议你继续使用 UNICODE。