0

0

C++怎么读写二进制文件_C++高效IO教程【紧凑】

冰火之心

冰火之心

发布时间:2026-02-25 14:53:35

|

887人浏览过

|

来源于php中文网

原创

二进制文件读写必须显式指定std::ios::binary标志,使用read()/write()而非格式化io,并检查gcount()/good();跨平台需处理字节序、内存对齐;关闭前需flush()并检查fail()。

c++怎么读写二进制文件_c++高效io教程【紧凑】

std::ifstreamstd::ofstream 以二进制模式打开文件

默认的文本模式会做换行符转换(比如 \n\r\n),读写结构体或原始字节时直接崩。必须显式指定 std::ios::binary 标志。

常见错误:只写 std::ios::instd::ios::out,漏掉 binary,结果数据错位、读到一半就 eof() 了。

  • std::ifstream fin("data.bin", std::ios::in | std::ios::binary);
  • std::ofstream fout("data.bin", std::ios::out | std::ios::binary);
  • 追加写入用 std::ios::app | std::ios::binary,但注意 app 模式下 seekp() 无效

读写原始内存块:别用 operator 和 <code>operator>>

这两个是格式化 IO,会解析空格、换行、类型分隔符,对二进制数据完全不可控。必须用 read()write() 直接操作字节流。

典型翻车现场:把一个 struct Point { int x, y; } 写进去,再用 <code>>> 读,结果 y 总是 0 —— 因为中间被当作文本分隔符吃了。

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

Gatekeep
Gatekeep

Gatekeep AI是一个专注于将文本转化为教学视频的智能教学工具,主要用于数学和物理等学科的教育。

下载
  • 写结构体:fout.write(reinterpret_cast<const char>(&p), sizeof(p));</const>
  • 读结构体:fin.read(reinterpret_cast<char>(&p), sizeof(p));</char>
  • 务必检查 gcount()good()read() 可能只读部分字节(比如磁盘满、中断)

跨平台写结构体前,先处理字节序和内存对齐

直接 write() 结构体看似快,但 struct 在不同编译器/平台下可能有填充字节(padding),且整数默认是本地字节序(小端/大端不统一)。发给 Python 或网络另一端时大概率解不开。

不是所有场景都要手撸序列化,但只要涉及跨语言、跨机器、长期存储,就不能跳过这步。

  • #pragma pack(1)alignas(1) 消除 padding(注意性能代价)
  • 关键字段(如 int32_t)用 htons()/htonl()std::byteswap() 统一为大端
  • 更稳的做法:逐字段 write() + 显式类型长度(比如固定写 4 字节 int32_t,而非 sizeof(int)

关闭文件前记得 flush() 和检查 fail()

析构函数会自动 close,但写失败不会抛异常,也不会提示你数据根本没落盘。尤其在嵌入式或低资源环境,缓存未刷导致静默丢数据很常见。

很多人以为 ofstream 离开作用域就万事大吉,其实 write() 成功只代表进了缓冲区,close() 才真正触发系统调用。

  • 显式调用 fout.flush() 后检查 !fout.fail()
  • 关闭后检查 !fout.fail(),失败时查 errno(Linux)或 GetLastError()(Windows)
  • 如果要确保原子写入,得用临时文件 + rename(),C++ 标准库不提供该语义

二进制 IO 的坑不在语法,而在“看起来写进去了”和“真的能被正确还原”之间那几行没写的检查与适配。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

552

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

365

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

200

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

584

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

158

2023.12.07

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

65

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.2万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号