You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++使用fwrite存储含wstring结构体乱码 wchar_t数组可正常写入

二者表现差异的核心原因
  • wchar_t数组属于C++原生固定长度数组,内存直接内联在结构体的内存空间中,整个Struct1的内存是连续固定大小的。你直接做二进制写入操作(比如fwrite、二进制模式ofstream的write方法)时,会把数组中存储的所有宽字符内容直接写入磁盘,读取时也能完整还原所有内容,因此功能正常。
  • std::wstring是C++标准库提供的字符串类,本质是类实例,它的内存布局和原生数组完全不同:std::wstring自身的内存空间里仅存储几个控制成员(一般是指向堆内存的字符串指针、当前字符串长度、缓冲区容量),实际的字符串内容是存放在堆内存中的,不属于结构体本身的内存范围。你直接dump结构体内存写入磁盘时,写入的是堆指针的地址值,而不是指针指向的实际字符串内容;读取时这些地址指向的堆空间早已失效,自然就会出现乱码、无法正常使用的问题。
若要序列化含std::wstring的结构体的实现方案

不要直接对结构体做内存二进制dump,需要手动实现序列化逻辑:

  1. 先写入mFoo的布尔值
  2. 再写入mBar的字符串长度
  3. 最后写入mBar.data()指向的实际宽字符内容
    读取时按完全相同的顺序依次读取对应字段即可正常还原。

内容的提问来源于stack exchange,提问作者Davel101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:57:06