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与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属性


