必须使用ios::binary标志读写二进制文件,正确检查gcount()和fail(),控制结构体填充并统一字节序,否则数据会损坏。
read() 和 write() 读写二进制文件必须用 ios::binary
不加这个标志,read() 和 write() 在 Windows 下会把 \x0A(LF)和 \x0D\x0A(CRLF)互相转换,导致二进制数据损坏。Linux/macOS 虽然影响小,但行为不一致,必须统一加。
std::ifstream 和 std::ofstream 构造时传入 std::ios::binary
open() 后再调用 setf(std::ios::binary) —— 这个调用无效std::fstream 并带上 ios::in | ios::out | ios::binary
read() 和 write() 的参数是 char* 和字节数,不是对象引用它们不识别类型,只按字节搬运。想写一个 int 或结构体,必须取地址并转成 char*,且确保内存布局安全(比如没虚函数、没非 POD 成员)。
int x = 42:file.write(reinterpret_cast(&x), sizeof(x))
file.read(reinterpret_cast(&x), sizeof(x))
std::is_trivially_copyable_v 为 true(大多数纯数据 struct 满足)std::string 或 std::vector 本体——它们内部指针不会被序列化gcount() 和 fail(),不能只看 eof()
read() 可能因文件末尾、磁盘错误或权限问题提前终止,gcount() 返回**
实际读取字节数**,它可能小于你请求的长度;fail() 在出错后才置位,eof() 只表示上次操作碰到了结尾,不是当前状态。
if (!file) { /* 写失败 */ }
while (file.read(buf, sizeof(buf))) {
size_t n = file.gcount();
// 处理 n 字节
}
if (file.fail() && !file.eof()) {
// 真正出错了
}while (!file.eof()) 控制读循环——它会导致多读一次失败即使你正确用了 ios::binary,在 x86(小端)和 ARM(可能大端)之间传输文件,或者不同编译器对同一 struct 的 padding 不同,都会让读出来的值错乱。
int32_t、uint16_t 可减少歧义,但仍需约定字节序(推荐网络序:用 htons()/htonl() 写,ntohs()/ntohl() 读)#pragma pack(1) 强制紧凑排列(但注意性能损失和对齐访问异常风险)二进制 I/O 表面简单,但 ios::binary 忘加、gcount() 不查、结构体 padding 不控、字节序不处理——这四点踩中任意一个,文件就可能无声无息地损坏。
# linux
# windows
# 字节
# mac
# ai
# c++
# ios
# macos
# win
# stream
# 一加
# cos
# 排列
# EOF
# String
# if
# while
# 结构体
# char
# int
# 循环
# 指针
# 虚函数
# ofstream
# ifstream
# fstream
# Struct
# 对象
# padding
# 序列化
# 错了
# 用了
# 要注意
# 会让
# 会把
# 只看
# 它会
# 后才
# 不加
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
php485支持哪些操作系统_php485跨系统支持情况介绍【解答】
LINUX怎么设置系统语言_LINUX修改中文环境
Python深度学习实战教程_神经网络模型构建与训练
Win11如何设置文件权限 Win11 NTFS文件夹所有权与安全设置【高级】
PythonPandas数据分析项目教程_时间序列透视表应用
Win11怎么更改盘符_Win11磁盘管理修改驱动器号【步骤】
Linux如何挂载新硬盘_Linux磁盘分区格式化与开机自动挂载【指南】
Win11怎么关闭任务栏小图标_Windows11任务栏角溢出设置
c++怎么使用std::tuple存储多元组数据_c++ 11获取元素与解包操作【技巧】
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
Windows10电脑怎么设置文件权限_Win10安全选项卡所有者修改
如何在 Go 中正确反序列化多个同级 XML 元素(而非单个根节点)
Win11怎么退出高对比度模式_Win11取消反色显示快捷键【修复】
win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】
C#如何使用XPathNavigator高效查询XML
Python正则表达式实战_模式匹配说明【教程】
MAC的“接续互通”功能无法使用怎么办_MAC检查蓝牙、Wi-Fi和相同Apple ID登录
VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】
如何在Golang中实现WebSocket广播_使用Channel和协程分发消息
c++如何连接Redis c++ hiredis库使用教程【指南】
C#如何在一个XML文件中查找并替换文本内容
如何在 Windows 11 中使用 AlomWare 工具箱
如何在Golang中实现并发消息队列消费者_Golang channel消息消费实践
Win11时间不对怎么同步_Win11自动校准互联网时间【设置】
Win11怎么开启移动热点_Windows11共享网络给手机设置教程
Win11键盘快捷键大全_Windows 11常用高效快捷键汇总【技巧】
Python网络超时处理_健壮性设计说明【指导】
Python函数参数高级用法_默认值与可变参数解析【教程】
php打包exe怎么传递参数_命令行参数接收方法【解答】
Mac如何修复应用程序权限问题_Mac磁盘工具修复权限【教程】
Win11怎么调整屏幕亮度_Windows 11调节显示器亮度护眼设置【步骤】
如何减少Golang内存碎片化_Golang内存分配与回收优化方法
Windows如何使用注册表查找和删除项?(regedit教程)
如何使用Golang实现云原生应用弹性伸缩_自动应对流量变化
Win10如何卸载自带Edge_Win10彻底卸载Edge浏览器教程【攻略】
Windows10如何更改盘符名称_Win10重命名硬盘分区卷标
如何在同包不同文件中正确引用 Go 结构体
MAC如何启用访达侧边栏显示_MAC Finder偏好设置与常用目录添加【教程】
Python并发安全问题_资源竞争说明【指导】
Linux如何使用grep搜索文件内容_Linux下正则表达式匹配与查找技巧【指南】
c++中explicit(bool)的用法 c++条件性explicit【C++20】
PHP怎么接收URL中的锚点参数_获取#后面参数值的技巧【详解】
php控制舵机角度怎么调_php发送pwm信号控制舵机转动【解答】
Windows蓝屏错误0x0000001E怎么修复_KMODEEXCEPTIONNOTHANDLED排查
VSC怎样用终端运行PHP_命令行执行脚本的步骤【教程】
如何用正则与预处理高效拦截带干扰符的恶意域名
Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】
php下载安装包太大怎么下载_分卷压缩下载方法【教程】
Windows怎样关闭桌面弹窗广告_Windows关闭桌面弹窗设置【教程】
Win11此电脑不在桌面上_Windows 11桌面图标设置找回【步骤】
2026-01-01
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。