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

