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与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  Laravel storage目录权限问题_Laravel文件写入权限设置  如何在万网自助建站平台快速创建网站?  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  如何在IIS中新建站点并解决端口绑定冲突?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何用搬瓦工VPS快速搭建个人网站?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel如何实现文件上传和存储?(本地与S3配置)  详解vue.js组件化开发实践  JavaScript如何操作视频_媒体API怎么控制播放  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  phpredis提高消息队列的实时性方法(推荐)  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  如何在 Pandas 中基于一列条件计算另一列的分组均值  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  php打包exe后无法访问网络共享_共享权限设置方法【教程】  音乐网站服务器如何优化API响应速度?  如何在阿里云购买域名并搭建网站?  Laravel安装步骤详细教程_Laravel环境搭建指南  JavaScript如何实现音频处理_Web Audio API如何工作?  如何在万网自助建站中设置域名及备案?  如何安全更换建站之星模板并保留数据?  轻松掌握MySQL函数中的last_insert_id()  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Laravel中的withCount方法怎么高效统计关联模型数量  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  浅谈javascript alert和confirm的美化  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Bootstrap整体框架之CSS12栅格系统  SQL查询语句优化的实用方法总结  如何快速搭建支持数据库操作的智能建站平台?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Laravel集合Collection怎么用_Laravel集合常用函数详解  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  深入理解Android中的xmlns:tools属性