C++ 怎么读取二进制文件 C++ fstream二进制模式读写操作【实战】

发布时间 - 2026-01-29 00:00:00    点击率:
必须加 std::ios::binary,否则Windows下会将\r\n转为\n并可能因\x1A提前截断,Linux虽影响小但跨平台需统一;不加则读取字节数与文件不符。

直接用 std::ifstreamstd::ios::binary 模式打开,配合 read()gcount() 才能正确读取二进制数据;默认文本模式会破坏 \x00 和换行符,千万别跳过 binary 标志。

为什么必须加 std::ios::binary

Windows 下文本模式会把 \r\n 自动转成单个 \n,还会把遇到的 \x1A(EOF 符)提前截断;Linux 虽影响小,但跨平台代码必须统一行为。不加这个标志,读出来的字节数和原始文件对不上是常态。

  • std::ifstream ifs("data.bin"); → 文本模式,危险
  • std::ifstream ifs("data.bin", std::ios::binary); → 正确起点
  • 写入同理:用 std::ofstream ofs("out.bin", std::ios::binary);

read() 怎么用才不丢数据?

read() 不保证一次读完全部内容,它只按请求长度尝试读,并通过 gcount() 返回实际字节数。尤其在从管道、网络流或某些文件系统读时,容易少读。

  • 先用 seekg(0, std::ios::end); + tellg() 获取真实大小
  • 分配足够缓冲区(比如 std::vector buf(size);
  • 调用 ifs.read(buf.data(), size); 后立刻检查:if (ifs.gcount() != size) { /* 错误处理 */ }
  • 不要依赖 !ifs.eof() 判断是否读完——它只在尝试读失败后才置位

读结构体或 POD 类型要注意什么?

可以直接 read() 进结构体变量,但前提是该类型是标准布局(standard-layout)、无虚函数、无非平凡构造/析构——也就是典型的 C 风格 struct。否则行为未定义。

立即学习“C++免费学习笔记(深入)”;

struct Header {
    uint32_t magic;
    uint16_t version;
    uint8_t  flags;
}; // ✅ 可直接 rea

d

Header h; ifs.read(reinterpret_cast>(&h), sizeof(h)); if (ifs.gcount() != sizeof(h)) { / 失败 */ }

  • 注意大小端:文件存的是大端,而 x86 是小端,需手动转换(如用 ntohl()
  • 结构体中间有 padding?#pragma pack(1)[[gnu::packed]] 控制对齐,否则 sizeof(Header) ≠ 实际磁盘布局
  • 别对 std::stringstd::vector 成员直接 read() —— 它们内部指针无效

最常被忽略的一点:读完记得检查 ifs.good() 或至少 ifs.fail(),而不是只看 gcount()。有些错误(比如权限不足)会导致 gcount() 为 0,但 failbit 已置位,不查就继续用缓冲区等于用野值。


# linux  # go  # windows  # 字节  # ai  # c++  # ios  # win  # stream  # 为什么  # EOF  # String  # if  # 结构体  # 指针  # 虚函数  # ofstream  # ifstream  # fstream  # Struct  # padding  # gnu  # 会把  # 不加  # 的是  # 也就  # 不上  # 要注意  # 可以直接  # 只在  # 千万别  # 可直接 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么在Blade中安全地输出原始HTML内容  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel如何发送系统通知?(Notification渠道示例)  Python文件异常处理策略_健壮性说明【指导】  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  QQ浏览器网页版登录入口 个人中心在线进入  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  如何挑选高效建站主机与优质域名?  简历在线制作网站免费版,如何创建个人简历?  奇安信“盘古石”团队突破 iOS 26.1 提权  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  图册素材网站设计制作软件,图册的导出方式有几种?  JS实现鼠标移上去显示图片或微信二维码  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  android nfc常用标签读取总结  网站制作壁纸教程视频,电脑壁纸网站?  Swift中swift中的switch 语句  移动端脚本框架Hammer.js  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Python进程池调度策略_任务分发说明【指导】  详解Huffman编码算法之Java实现  BootStrap整体框架之基础布局组件  Laravel怎么实现模型属性的自动加密  zabbix利用python脚本发送报警邮件的方法  Laravel如何使用Collections进行数据处理?(实用方法示例)  如何快速搭建高效WAP手机网站?  昵图网官方站入口 昵图网素材图库官网入口  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  LinuxShell函数封装方法_脚本复用设计思路【教程】  Python数据仓库与ETL构建实战_Airflow调度流程详解  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Laravel如何自定义分页视图?(Pagination示例)  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何在万网主机上快速搭建网站?  专业商城网站制作公司有哪些,pi商城官网是哪个?  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  JavaScript如何操作视频_媒体API怎么控制播放  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  简单实现Android验证码  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法