c++如何将结构体中的std--string安全写入文件_深浅拷贝陷阱【避坑】
直接用 write() 写含 std::string 的结构体会丢失字符串内容因其内部仅存指针、长度、容量真实数据在堆上正确做法是手动序列化先写固定宽度长度如 uint32_t再写字符数据。直接用 write() 写结构体会导致字符串内容丢失因为 std::string 在内存里不是纯数据块它只存指针、长度、容量三个字段具体布局因标准库实现而异真正字符数据在堆上。用 write() 对结构体做 memcpy-style 二进制写入只会把指针值写进文件读取时指针已失效解引用必崩。常见错误现象read() 后 std::string 构造失败、data() 返回空指针、size() 为 0 或乱码典型场景跨进程共享结构体二进制文件、用 fread/fwrite 做快速序列化别信“结构体没虚函数就能 memcpy”——只要含 std::string、std::vector 等非 POD 类型就不是 trivially copyable手动序列化每个 std::string 字段推荐本质是把字符串长度和内容分开写先写 size()建议用固定宽度整数如 uint32_t再写 c_str() 指向的字节流。读取时反向操作即可。必须用 uint32_t 或 size_t注意跨平台大小写长度不能直接写 size_t —— Windows 上是 4 字节Linux x64 是 8 字节不统一就无法跨平台读std::string 的 c_str() 保证以 结尾但写入时不要写这个结尾符否则读取时会多出一个字节且和长度字段矛盾示例关键片段uint32_t len static_castuint32_t(s.length());out.write(reinterpret_castconst char*(len), sizeof(len));out.write(s.c_str(), len);用 std::ofstream 的文本模式 自定义格式简单场景可用绕过二进制陷阱最直白的办法不写原始内存改写可读字符串。适合调试、配置、日志等对性能不敏感的场景。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2589437.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!