C++ 怎么读取二进制文件 C++ fstream二进制模式读写操作【实战】
发布时间 - 2026-01-29 00:00:00 点击率:次必须加 std::ios::binary,否则Windows下会将\r\n转为\n并可能因\x1A提前截断,Linux虽影响小但跨平台需统一;不加则读取字节数与文件不符。
直接用 std::ifstream 以 std::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::string或std::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执行方法


