C++文件写入包括字符串的内存地址,而不是内容
C++ File Write includes the memory address of the string instead of the contents
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
,则很有用。
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- CUDA:统一内存和指针地址的更改
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 如何读取特定地址的进程内存?
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- LLVM 传递以在特定地址分配内存
- 无法将内存地址转换为值
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 获取 R 数据帧的内存地址
- 如何配置bazel以运行地址/内存清理器?
- 存储 std::list 元素的地址;内存
- 确定库的地址内存