C++用ifstream读取二进制文件详细步骤+代码
技术百科
冰火之心
发布时间:2026-01-21
浏览: 次 用 std::ifstream 二进制读文件必须加 std::ios::binary,否则 Windows 下会错误转换 \r\n;需检查 is_open()、用 seekg/tellg 获取大小、read() 后必查 gcount()、close() 后检查 fail()。
用 std::ifstream 以二进制模式打开文件必须加 std::ios::binary
不加这个标志,Windows 下会把 \r\n 自动转成 \n,读出来的字节数和文件实际大小对不上,尤其读图片、音频、加密数据时直接出错。Linux/macOS 虽然影响小,但跨平台代码必须统一加。
常见错误:只写 std::ifstream file("data.bin") —— 这是文本模式,默认启用换行符转换。
- 正确写法:
std::ifstream file("data.bin", std::ios::binary) - 打开后务必检查:
if (!file.is_open()) { /* 处理失败 */ } - 如果路径含中文或特殊字符,C++ 标准库在 Windows 上默认不支持宽字符路径,建议用 UTF-8 编码路径 + 编译器扩展(如 MSVC 的
/utf-8)或改用std::filesystem::u8path(C++17)
读取全部内容到内存推荐用 std::vector + read
std::ifstream::read() 是最可控的二进制读取方式,它不解析内容、不跳过空白、不添加终止符,完全按字节搬运。配合 std::vector 可避免手动 new[]/delete[] 和缓冲区溢出风险。
别用 getline() 或 >> 操作符——它们是为文本设计的,遇到 \0 或控制字符就停了。
std::ifstream file("data.bin", std::ios::binary);
if (!file.is_open()) {
// 错误处理
}
file.seekg(0, s
td::ios::end);
size_t size = file.tellg();
file.seekg(0, std::ios::beg);
std::vector buffer(size);
file.read(buffer.data(), size);
// 检查是否读满
if (file.gcount() != static_cast(size)) {
// 读取异常:磁盘错误、权限不足、文件被截断等
}
gcount() 是唯一可靠的方式判断实际读了多少字节
read() 不抛异常(除非设置了 exceptions()),也不返回成功字节数。它只更新内部状态,而 gcount() 返回上一次输入操作实际提取的字符数——这是你唯一能信的数字。
- 即使
file.good()为 true,gcount()也可能小于预期(比如文件末尾突然变小) - 不要依赖
file.eof()判断读完:它只在尝试读越界后才置位,容易误判 - 如果要分块读大文件(比如 64KB 一块),每次调用
read()后都得立刻查gcount()
关闭文件前记得检查 failbit 防止静默失败
二进制读取中,磁盘 I/O 错误可能不立即暴露。比如读到一半电源中断,read() 可能只返回部分字节,failbit 却没立刻置位;直到你调用 close() 或析构时才触发底层错误。
所以,在 file.close() 后应检查状态:
file.close();
if (file.fail()) {
// 底层 close 失败:磁盘已满、文件系统只读、权限变更等
// 此时 buffer 中的数据仍是有效的(读取已完成),但需记录该错误
}更稳妥的做法是:读完即用 file.exceptions(std::ios::failbit | std::ios::badbit) 开启异常,让错误在发生时立刻抛出——但要注意,这会让 close() 也抛异常,需包裹 try/catch。
实际项目里最容易被忽略的是:没验证 gcount(),也没检查 close() 结果,导致“以为读全了”,结果后续解析崩溃。
# ai
# 的是
# 这是
# 也不
# 到你
# windows
# 也没
# 停了
# 只在
# mac
# 不支持
# win
# linux
# go
# macos
# c++
# if
# 编码
# 字节
# stream
# 仍是
# delete
# char
# try
# catch
# ios
# 不上
# EOF
# Filesystem
# 一加
# ifstream
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何理解Go指针和内存分配关系_Go Pointe
- LINUX的SELinux是什么_详解LINUX强
- Win11怎么关闭右下角弹窗_Win11拦截系统通
- Win11关机快捷键是什么_Win11快速关机方法
- C++如何将C风格字符串(char*)转换为std
- VSC里PHP变量未定义报错怎么解决_错误抑制技巧
- Win11怎么查看显卡显存_查询Win11显卡详细
- 如何使用Golang实现多重错误处理_Golang
- Mac系统更新下载慢或失败怎么办_解决macOS升
- 如何使用Golang操作指针变量_Golang解引
- Python包结构设计_大型项目组织解析【指导】
- 如何在Golang中编写异步函数测试_Golang
- Win11怎样安装剪映专业版_Win11安装剪映教
- Win11相机打不开提示错误怎么修_相机权限开启与
- Win11怎么关闭SmartScreen_禁用Wi
- Win11怎么设置开机自动连接宽带_Windows
- c++ reinterpret_cast怎么用 c
- Win11怎么开启剪贴板历史记录_Windows1
- Win10怎样清理C盘阿里旺旺缓存_Win10清理
- php在Linux怎么部署_LNMP环境搭建PHP
- 如何优化Golang内存分配与GC调度_Golan
- Win11如何更改用户账户文件夹名称 Win11修
- 如何在 Go 应用中实现自动错误恢复与进程重启机制
- Windows 10怎么把任务栏放在屏幕上方_Wi
- Win11怎么关闭粘滞键_彻底禁用Windows
- mac本地php环境如何开启curl_curl扩展
- 如何使用Golang实现路由参数绑定_使用Mux和
- PythonFastAPI项目实战教程_API接口
- Mac自带的词典App怎么用_Mac添加和使用多语
- Python变量绑定机制_引用模型解析【教程】
- Win11怎么打开旧版计算器_Win11恢复传统计
- Win10系统字体模糊怎么办_Windows10高
- 如何在Golang中使用replace替换模块_指
- php报错怎么查看_定位PHP致命错误与警告的方法
- c++如何使用std::bind绑定函数参数_c+
- Win10如何卸载预装Edge扩展_Win10卸载
- 如何在 Go 中正确测试带 Cookie 的 HT
- Win11如何添加/删除输入法 Win11切换中英
- php怎么下载安装后无法解析php文件_服务器配置
- 短链接还原php提示内存不足_调整PHP内存限制设
- Windows怎样关闭Edge新标签页广告_Win
- php下载安装包太大怎么下载_分卷压缩下载方法【教
- Python多进程教程_multiprocessi
- Win10如何卸载微软拼音输入法 Win10只保留
- Win11如何设置系统语言_Win11系统语言切换
- 如何在JavaScript中动态拼接PHP的bas
- c++如何利用doxygen生成开发文档_c++
- 小程序里php怎么变mp4_小程序调用php生成m
- Win11怎么更改鼠标指针_Windows 11自
- php本地部署后数据库连接报错_1045acces


QQ客服