讲师中心 微信公众号
AI工具推荐 视频效率加速

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

陌枫酱_2535

陌枫酱_2535

发布时间:2026-03-22 23:51:11

|

493人浏览过

|

来源于php中文网

原创

使用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 字节整数

file.seekp(100);</code><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));

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

C++14
C++14

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

下载

写入后记得 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++

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

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

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

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

4514

2025.06.09

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

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

4651

2025.07.04

string转int
string转int

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

6039

2023.08.02

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

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

2965

2024.08.29

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

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

3768

2025.08.29

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

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

2645

2025.08.29

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

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

3179

2023.07.26

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

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

2758

2023.07.27

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

80

2026.10.10

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn