直接用write()写结构体出现乱码,是因为内存对齐产生的填充字节被一并写入,而这些padding无意义且跨平台不一致;应显式序列化必要字段,跳过padding和非POD成员。直接用 write() 写结构体,为什么读出来全是乱码?因为结构体默认存在内存对齐(padding),编译器会在成员之间插入填充字节以提升访问效率。比如 struct { char a; int b; } 在多数平台实际占 8 字节(a 占 1,后面 3 字节 padding,b 占 4),但你只预期 5 字节。用 write() 直接写入,就把 padding 也写进文件了------这些字节无意义,且跨平台/跨编译器不一致。确认对齐方式:sizeof(YourStruct) 和手动加总成员大小对比,差值就是 padding 总量检查实际布局:#pragma pack(1) 或 attribute((packed)) 可禁用对齐(但要小心性能和硬件限制)别依赖 memcpy 到临时 buffer 再写------如果 struct 本身含 padding,memcpy 仍会复制它如何安全地一次性写入多个变量(非结构体)?本质是把变量按需拼成连续内存块。不能直接传多个参数给 write(),它只接受一个起始地址和长度。常见做法是用 std::vector<char></char> 或栈上数组做缓冲区,按顺序 memcpy 进去。基础示例:int x = 10, y = 20;double z = 3.14;std::vector<char> buf(sizeof(x) + sizeof(y) + sizeof(z));char* p = buf.data();memcpy(p, &x, sizeof(x)); p += sizeof(x);memcpy(p, &y, sizeof(y)); p += sizeof(y);memcpy(p, &z, sizeof(z));write(fd, buf.data(), buf.size());注意字节序:若文件需跨平台读取,所有数值必须统一转为网络序(htonl/htons 等),否则 x86 和 ARM 解析结果不同浮点数尤其危险:double 的二进制表示不是标准跨平台格式,IEEE 754 虽普遍但仍有 endianness 和 NaN 表示差异write() 写二进制时,open() 必须加 O_BINARY 吗?在 Linux/macOS 上不用,O_BINARY 是 Windows 特有宏(实际定义为 0),被忽略;但在 Windows 下用 MSVC 或 MinGW,**必须加**,否则 可能被误转为 ,破坏二进制数据完整性。Windows 正确写法:int fd = open("data.bin", O_WRONLY | O_CREAT | O_BINARY, 0644);跨平台兼容写法:用 #ifdef _WIN32 包裹 O_BINARY,或改用 fopen("data.bin", "wb") + fwrite()(更推荐,语义清晰且自动处理 binary 模式)用 write() 时,确保 fd 来自 open() 而非 fopen() ------ 二者文件描述符体系不互通结构体写入前,真的只能靠 #pragma pack 吗?不是。#pragma pack 全局影响后续声明,易引发隐蔽冲突;更可控的方式是显式序列化:只拷贝你真正需要的字段,跳过 padding 和非 POD 成员。 Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西
相关推荐
Rain的Java大神之路12 分钟前
线上接口负载满了如何解决Nturmoils19 分钟前
给运营导个 CSV,在 ksql 里用 \copy 就够了jerryinwuhan25 分钟前
《Python数据预处理》第四章ciqingloveless29 分钟前
Oracle打开数据库加密雨晨源码(同名B站)1 小时前
基于Python的网易云音乐评论数据情感化分析系统 音乐爬虫信息可视化 |SnowNLP评论情感分析阿童木写作1 小时前
跨境电商图片翻译工具推荐:跨马翻译批量处理视频字幕与抠图m0_462605221 小时前
大模型week02DBA_G1 小时前
GBase 8a数据库集群多维度资源管控策略矩阵解析怪奇云呼军2 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选ZC跨境爬虫2 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)