c++如何修改二进制文件指定位置内容_seekp随机访问【实战】

陌枫酱_2535

陌枫酱_2535

2026-03-22

493人浏览

原创

使用seekp前必须以ios::in|ios::out|ios::binary模式打开文件,偏移量单位为字节,需用offsetof确认结构体字段真实偏移,写入后须flush或close确保落盘。

c++如何修改二进制文件指定位置内容_seekp随机访问【实战】

用 seekp 定位写入前必须检查文件是否可写

二进制文件写入失败,十有八九不是 seekp 用错了,而是文件没以可写模式打开。C++ 的 ofstream 默认是截断(trunc)模式,一打开就把原文件清空;如果只想修改中间某几个字节,必须显式加 ios::in | ios::out | ios::binary。

  • ofstream 单独用无法读取原内容,也就没法“改”——它只负责写,不负责读
  • fstream 是正确选择,但必须同时带 ios::in 和 ios::out,否则 seekp 可能定位成功,write 却静默失败(尤其在 Windows 上)
  • Linux 下若文件权限为只读,open 会直接失败;Windows 下可能成功打开但写入时抛异常或返回 0 字节

示例:

fstream file("data.bin", ios::in | ios::out | ios::binary);
缺任何一个 flag 都可能让你卡在“明明 seekp 返回无错,但文件没变”上。

seekp 偏移量单位是字节,别和数组下标混淆

你传给 seekp 的数字,就是从文件开头算起的第几个字节。不是“第几个 int”,也不是“第几行”,更不是“第几个结构体字段偏移”。如果想改第 3 个 int32_t(假设它从 offset 8 开始),就得传 8,而不是 3。

  • 结构体对齐会影响真实偏移:struct { char a; int b; } 中 b 的偏移通常是 4,不是 1 —— 编译器插入了填充字节
  • 用 offsetof 宏确认字段偏移比手算靠谱:offsetof(MyStruct, field_name)
  • 写入长度必须和你要覆盖的数据严格一致;多写会破坏后续数据,少写会留下脏字节

示例:改第 100 字节开始的 4 字节整数

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
file.seekp(100);<br><code>int32_t new_val = 0x12345678;</code><br><pre class="brush:php;toolbar:false;">file.write(reinterpret_cast<const char>(&new_val), sizeof(new_val));</const>

写入后记得 flush

或关闭,否则内容可能滞留在缓冲区

很多情况下你调完 write 立即去用十六进制编辑器看文件,发现没变——不是代码没执行,是 C++ 标准库默认缓冲,数据还没真正落盘。

  • file.flush() 强制刷出缓冲区,适合写完还想继续操作文件的场景
  • 更稳妥的是 file.close(),它隐含 flush,且释放资源;不关文件就退出程序,可能丢数据
  • 某些平台(如嵌入式或旧系统)对未 flush 的写入行为更敏感,甚至导致文件损坏

别依赖“程序结束自动 flush”——异常退出、exit()、信号中断都可能导致缓冲区丢失。

跨平台注意:换行符、BOM、文件长度边界

在 Windows 上用文本模式打开二进制文件,\r\n 会被当成一个字符处理,seekp 偏移全乱;而 UTF-8 BOM(0xEF 0xBB 0xBF)虽然不影响 seekp,但如果你硬编码偏移量,BOM 存在与否会让同一份逻辑在不同机器上改错位置。

  • 务必用 ios::binary —— 这不是可选项,是强制项
  • 用 file.tellg() 或 file.tellp() 检查当前偏移,比靠脑子算更可靠
  • 写入前先 file.seekg(0, ios::end); size_t len = file.tellg(); 确认目标偏移没越界,避免静默截断或未定义行为

最常被忽略的一点:seekp 到文件末尾之后再写,标准行为是扩展文件(填 0),但某些老旧文件系统或只读挂载点会失败——得提前判断并处理错误码。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2025.06.09

4514

18

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

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

2025.07.04

4651

25

string转int
string转int

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

2023.08.02

6039

3

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

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

2024.08.29

2965

6

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

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

2025.08.29

3768

10

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

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

2025.08.29

2645

10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3179

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2758

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1468

3

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习