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

c++怎么在文件中间插入一行字符串_内存后移与临时流【详解】

夜浩大大_9913

夜浩大大_9913

发布时间:2026-03-26 17:40:01

|

145人浏览过

|

来源于php中文网

原创

文件中间插入字符串不能直接 fseek + fwrite,因为会覆盖而非推移后续内容;必须通过临时文件读取、分段写入再重命名替换实现。

c++怎么在文件中间插入一行字符串_内存后移与临时流【详解】

文件中间插入字符串为什么不能直接 fseek + fwrite

因为文件系统不支持“在中间插入”,fseek 定位后 fwrite 只会覆盖,不会推后原有内容。你看到的“插入”效果,其实是靠重写整个文件实现的——这是最常被误解的起点。

  • 磁盘上文件是连续字节块,没有“空隙”可插;内存里字符串能 insert,文件不行
  • std::fstream::ate 或 ios::in | ios::out 模式下直接写,大概率导致后续数据被截断或错位
  • 即使文件很小,用 seekp 跳到中间再写,也只覆盖,不移动后面字节

标准做法:用临时文件 + 逐段复制

真正可靠、跨平台、不依赖 mmap 的方案,就是读原文件、在目标位置拆开、写入新行、再续写剩余内容——全部通过一个临时 std::ofstream 完成。

  • 打开原文件为 std::ifstream,临时文件为 std::ofstream
  • 用 std::getline 逐行读,计数到第 N 行后,先写入你要插入的字符串,再写回当前行(即插入在该行上方)
  • 或者按字节偏移定位:用 is.seekg(0, std::ios::end) 获取长度,再 is.seekg(0) 从头读,用 is.read(buf, n) 分段搬运
  • 写完关闭两个流,用 std::filesystem::rename(C++17)或 std::rename 替换原文件(注意 Windows 下需先 remove)
std::ifstream src("data.txt");
std::ofstream tmp("data.tmp");
std::string line;
int line_no = 0;
while (std::getline(src, line)) {
    if (++line_no == 3) tmp << "INSERTED LINE\n";
    tmp << line << '\n';
}
src.close(); tmp.close();
std::filesystem::rename("data.tmp", "data.txt");

想“内存后移”?别碰 mmap,除非你控制所有边界

有人想用 mmap 把文件映射进内存,然后用 memmove 推动后面字节——理论上可行,但实际极难安全落地。

C++14
C++14

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

下载
  • 文件大小必须提前扩展(ftruncate),否则 memmove 写越界就是 SIGBUS
  • 映射需用 MAP_SHARED,且操作系统不一定立即刷盘,崩溃可能丢数据
  • Windows 的 CreateFileMapping 对扩展映射支持弱,MapViewOfFile 无法动态增长
  • 多进程同时访问该文件时,mmap 行为不可控,竞态比临时文件更隐蔽

性能与兼容性取舍:小文件用临时流,大文件考虑分块 or 放弃“插入”语义

如果文件超 100MB,每次插入都全量复制显然慢;这时要重新思考需求本质:你真的需要“插入”,还是只是“让某行看起来在中间”?

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

  • 日志类场景:追加写 + 索引文件,查的时候逻辑合并,物理不插入
  • 配置文件:改用 JSON/YAML,用库(如 nlohmann/json)解析-修改-序列化,比手动拼接安全得多
  • 若坚持原地改,C++23 的 std::filesystem::resize_file 配合 mmap 仍需处理对齐、页大小、错误恢复——这些细节漏一条,程序就静默损坏文件

真正麻烦的从来不是“怎么写那几行代码”,而是“谁在同时读这个文件”“断电时写到一半怎么办”“换行符是 \n 还是 \r\n”——这些不会报错,但会让修复成本远高于重设计。

相关文章

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

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

下载

相关标签:

c++

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

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

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

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

Seko
Seko Hot

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

WorkBuddy

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

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2175

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3402

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1136

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3899

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2804

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6144

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5889

2023.11.24

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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