c++中如何进行二进制文件读写_c++ read与write函数用法


必须使用ios::binary标志读写二进制文件,正确检查gcount()和fail(),控制结构体填充并统一字节序,否则数据会损坏。

直接用 read()write() 读写二进制文件必须用 ios::binary

不加这个标志,read()write() 在 Windows 下会把 \x0A(LF)和 \x0D\x0A(CRLF)互相转换,导致二进制数据损坏。Linux/macOS 虽然影响小,但行为不一致,必须统一加。

  • std::ifstreamstd::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 = 42file.write(reinterpret_cast(&x), sizeof(x))
  • 读回:file.read(reinterpret_cast(&x), sizeof(x))
  • 结构体可读写前提是 std::is_trivially_copyable_vtrue(大多数纯数据 struct 满足)
  • 千万别传 std::stringstd::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_tuint16_t 可减少歧义,但仍需约定字节序(推荐网络序:用 htons()/htonl() 写,ntohs()/ntohl() 读)
  • struct 读写前用 #pragma pack(1) 强制紧凑排列(但注意性能损失和对齐访问异常风险)
  • 更可靠的做法是定义明确的序列化格式(如 Protocol Buffers),而不是裸写内存

二进制 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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.