0

0

c++中如何进行二进制文件读写_c++ read与write函数用法

穿越時空

穿越時空

发布时间:2026-01-01 17:55:53

|

282人浏览过

|

来源于php中文网

原创

必须使用ios::binary标志读写二进制文件,正确检查gcount()和fail(),控制结构体填充并统一字节序,否则数据会损坏。

c++中如何进行二进制文件读写_c++ read与write函数用法

直接用 read()write() 读写二进制文件必须用 ios::binary

不加这个标志,read()write() 在 Windows 下会把 \x0A(LF)和 \x0D\x0A(CRLF)互相转换,导致二进制数据损坏。Linux/macOS 虽然影响小,但行为不一致,必须统一加

  • std::ifstreamstd::ofstream 构造时传入 std::ios::binary
  • 不能只靠 open() 后再调用 setf(std::ios::binary) —— 这个调用无效
  • 如果同时要读写,用 std::fstream 并带上 ios::in | ios::out | ios::binary

read()write() 的参数是 char*字节数,不是对象引用

它们不识别类型,只按字节搬运。想写一个 int 或结构体,必须取地址并转成 char*,且确保内存布局安全(比如没虚函数、没非 POD 成员)。

  • 写一个 int x = 42file.write(reinterpret_cast(&x), sizeof(x))
  • 读回:file.read(reinterpret_cast(&x), sizeof(x))
  • 结构体可读写前提是 std::is_trivially_copyable_vtrue(大多数纯数据 struct 满足)
  • 千万别传 std::stringstd::vector 本体——它们内部指针不会被序列化

务必检查 gcount()fail(),不能只看 eof()

read() 可能因文件末尾、磁盘错误或权限问题提前终止,gcount() 返回**实际读取字节数**,它可能小于你请求的长度;fail() 在出错后才置位,eof() 只表示上次操作碰到了结尾,不是当前状态。

  • 写操作同样要检查:if (!file) { /* 写失败 */ }
  • 读循环典型写法:
    while (file.read(buf, sizeof(buf))) {
        size_t n = file.gcount();
        // 处理 n 字节
    }
    if (file.fail() && !file.eof()) {
        // 真正出错了
    }
  • 不要用 while (!file.eof()) 控制读循环——它会导致多读一次失败

跨平台二进制文件要注意字节序和结构体填充

即使你正确用了 ios::binary,在 x86(小端)和 ARM(可能大端)之间传输文件,或者不同编译器对同一 struct 的 padding 不同,都会让读出来的值错乱。

MCP官网
MCP官网

Model Context Protocol(模型上下文协议)

下载

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

  • 基础类型如 int32_tuint16_t 可减少歧义,但仍需约定字节序(推荐网络序:用 htons()/htonl() 写,ntohs()/ntohl() 读)
  • struct 读写前用 #pragma pack(1) 强制紧凑排列(但注意性能损失和对齐访问异常风险)
  • 更可靠的做法是定义明确的序列化格式(如 Protocol Buffers),而不是裸写内存

二进制 I/O 表面简单,但 ios::binary 忘加、gcount() 不查、结构体 padding 不控、字节序不处理——这四点踩中任意一个,文件就可能无声无息地损坏。

相关专题

更多
string转int
string转int

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

312

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

713

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

81

2023.09.25

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

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

193

2025.06.09

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

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

186

2025.07.04

string转int
string转int

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

312

2023.08.02

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

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

522

2024.08.29

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

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

49

2025.08.29

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

热门下载

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

精品课程

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

共48课时 | 6.4万人学习

Git 教程
Git 教程

共21课时 | 2.3万人学习

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

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