C++ 修改/覆盖指定位置的文件内容或者从某个位置开始截断文件

2023-10-29

最新在进行文件方面的功能开发。遇到个这样的问题:(1)文件读到中间,然后进行一些修改,(2)然后将文件从修改后的地方截断。本以为这是个简单的操作,却花费了好大的功夫(网上并没有这样的例子,一通尝试)。现在终于圆满解决了,特地记录一下,方便后来人。

1.修改/覆盖指定位置的文件内容

【ps】下文一直提到文件中间区域位置,就是指非文件开头和结尾的位置。为什么强调这个呢?因为开头和结尾就是很常规的就成功了,而非开头和结尾的位置则有注意点才能成功。

开头提到的问题(1),即文件读到中间或者其他位置,对内容进行一些修改。所谓修改,即覆盖原文件那个位置的内容,文件大小并不发生变化。

ofstream在打开文件时默认清空文件所有内容。如果使用ios::app来打开文件,虽然不会清空文件内容,但是每次写操作都追加到文件末尾,即使你seekp也没用。

#include<fstream>
using namespace std;

int main()
{
	fstream fs("F:\\test.txt", ios::binary | ios::out | ios::app);
	//跳转到开头的第二个字节位置进行写入,最后发现还是写在结尾,即使seekp也没用。
	fs.seekp(2,ios::beg);
	fs.write("!!!", 3);
	fs.close();
	return 0;
}

运行结果:开始text.text 内容是abcdefgh。现在变为abcdefgh!!!。无效,app模式是一定写在后面的,seekp也无效。

解决办法是使用 fstream 并且再加个文件打开模式ios::app替换为ios::in,这样可以保证文件内容不会被清空,且文件指针偏移操作有效。

下面是正确操作:

#include<fstream>
using namespace std;

int main()
{
	fstream fs("F:\\test.txt", ios::binary | ios::out | ios::in);
	//跳转到开头的第二个字节位置进行写入,正常写入
	fs.seekp(2,ios::beg);
	fs.write("!!!", 3);
	fs.close();
	return 0;
}

运行结果:开始text.text 内容是abcdefgh。现在变为ab!!!fgh。成功实现对文件的中间区域进行修改。

【注意点】:中间的位置必须使用feekp然后再写才能成功修改。并且seekp之后,如果继续读一些内容,然后再写也写不进去。必须seekp之后就写,才写的进去。看下面例子就明白了。

#include<fstream>
using namespace std;

int main()
{
	fstream fs("F:\\test.txt", ios::binary | ios::out | ios::in);
	//文件指针正常到第二个字节,然后进行写入,发现写不进去。
	char buf[2];
	fs.read(buf, sizeof(buf));
	fs.write("!!!", 3);
	fs.close();
	return 0;
}

运行结果:开始text.text 内容是abcdefgh。现在还是abcdefgh。写不进去啊。一开始就是这样操作的,一脸懵。就像上面说的,在fs.read的下一行加个feekp,然后再写就好了。看到这里你应该明白上面的注意点是什么意思了。

2.从某个位置开始截断文件

以前的c++标准库里面是不提供这个功能的,只能依赖操作系统的api。随着c++17标准库中加入了filesystem,其中有个resize_file函数,便十分方便的截断文件

定义于头文件 <filesystem>
void resize_file(const std::filesystem::path& p,
                 std::uintmax_t new_size);
void resize_file(const std::filesystem::path& p,
                 std::uintmax_t new_size,
                 std::error_code& ec) noexcept;

更改 p 所指名的的常规文件大小。
若先前的文件大小大于 new_size ,则文件的剩余部分被舍弃。
若先前的文件大小小于 new_size ,则增加文件大小,而且新区域如同以零填充。

 

从某个位置截断文件,即只要这么大的文件,然后用这个size进行 resize_file截断就好了。下面是正确的演示

#include<fstream>
#include<filesystem>
using namespace std;

int main()
{
	//5字节处进行截断,即只有5字节大小
	filesystem::resize_file("F:\\test.txt", 5);
	return 0;
}

运行结果:开始text.text 内容是abcdefgh。现在是abcd。正确的从第五个字节进行截断。

【ps】如果不支持c++17,则使用系统api。

//linux系统
#include <unistd.h>
 int ftruncate(int fildes, off_t length);
 int truncate(const char *path, off_t length); 

//windows系统
int _chsize( int fd,long size );

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 修改/覆盖指定位置的文件内容或者从某个位置开始截断文件 的相关文章

  • Hadoop之HDFS文件操作

    摘要 xff1a Hadoop之HDFS文件操作常有两种方式 xff0c 命令行方式和JavaAPI方式 本文介绍如何利用这两种方式对HDFS文件进行操作 关键词 xff1a HDFS文件 命令行 Java API HDFS是一种分布式文件
  • ftp文件操作

    FTP中的文件操作 如何对ftp文件系统进行操作 文章目录 FTP中的文件操作前言一 ftp是什么 xff1f 二 使用步骤1 本地创建搭建ftp系统2 操作 总结 前言 公司中运用到了ftp小文件系统 xff0c 自己在本地学习了一下网上
  • C#文件操作

    在前面操作变量和常量时这些值都是存放到内存中的 xff0c 当程序运行结束后使用的数据全部被删除 若需要长久保存应用程序中的数据 xff0c 可以选用文件或数据库来存储 文件通常存放到计算机磁盘上的指定位置 xff0c 可以是记事本 Wor
  • QT文件操作

    文章目录 QFile文件操作QFile 43 QTextStreamQFile 43 QDataStream 已剪辑自 http c biancheng net view 9430 html 很多应用程序都需要具备操作文件的能力 xff0c
  • C++文件操作

    文章目录 计算机文件到底是什么 xff08 通俗易懂 xff09 xff1f C 43 43 文件类 xff08 文件流类 xff09 及用法详解C 43 43 open 打开文件 xff08 含打开模式一览表 xff09 使用 open
  • 文件操作fwrite写txt文件乱码怎么办,我这里有方法解决

    很多大一新生到了期末做课设时 xff0c 遇到文件操作 总会有人不明白为什么写入的内容会乱码 先引入一些知识 xff1b 文件有二进制文件 xff0c 文本文件 二进制文件是按内存写入的 xff1b 文本文件是按格式写入的 xff1b 因此
  • Groovy学习-IO/文件操作

    读取文件 读取文本文件并打印每一行文本 new File 39 39 39 a txt 39 eachLine line gt println line eachLine方法是Groovy为File类自动添加的方法 xff0c 同时提供多个
  • QT中的文件操作

    QT中的文件操作基于QFile类 1 打开文件 open bool open File fh QIODevice OpenMode mode QFileDevice FileHandleFlags handleflags DontClose
  • 使用jxl解析Excel出现的问题

    jxl read biff BiffException Unable to recognize OLE stream at jxl read biff CompoundFile CompoundFile java 116 at jxl re
  • win7及以上系统C++实现Hook explorer文件级监控复制、剪切和删除操作

    最近项目组需要实现一个对windows用户文件操作进行监控的功能 也就是使用explorer资源管理器的操作 于是乎我就想到了使用Hook的方法进行拦截 查找一番资料后发现XP调用的是最简单的CopyFileEx MoveFileWithP
  • C++ 修改/覆盖指定位置的文件内容或者从某个位置开始截断文件

    最新在进行文件方面的功能开发 遇到个这样的问题 1 文件读到中间 然后进行一些修改 2 然后将文件从修改后的地方截断 本以为这是个简单的操作 却花费了好大的功夫 网上并没有这样的例子 一通尝试 现在终于圆满解决了 特地记录一下 方便后来人
  • C++ std::remove/std::remove_if/erase用法探讨

    std remove 不会改变输入vector string的长度 其过程相当于去除指定的字符 剩余字符往前靠 后面的和原始字符保持一致 需要注意的是 remove函数是通过覆盖移去的 如果容器最后一个值刚好是需要删除的 则它无法覆盖掉容器
  • LinuxC文件操作接口

    LinuxC文件操作接口 创建与删除 创建文件 FILE fopen const char filename const char mode int open const char pathname int flags mode t mod
  • std::atomic和std::mutex区别

    std atomic介绍 模板类std atomic是C 11提供的原子操作类型 头文件 include
  • qt中复制文件的功能

    1 利用qt来复制文件 首先新建个工程文件 拖入按钮 复制文件 2 需要引入的头文件如下 include
  • Mayor's posters

    点击打开链接 Description The citizens of Bytetown AB could not stand that the candidates in the mayoral election campaign have
  • C# 文件操作之创建文件夹

    本文章主要是讲述C 中文件操作的基础知识 如何创建文件夹 创建文件 介绍Directory类 DirectoryInfo类和使用FolderBrowserDialog组件 文件夹对话框 文章属于基础知识 参考了书籍刘丽霞 C 范例开发大全
  • 设计模式八大原则知多少

    设计模式是一种通用的解决问题的经验 可以帮助我们设计出可重用 可维护和可扩展的软件 在设计模式中 有八个常见的原则 它们是 单一职责原则 SRP Single Responsibility Principle 一个类应该只有一个引起变化的原
  • C++ 重载、覆盖、隐藏

    C 重载 覆盖 隐藏 重载 覆盖和隐藏是C 中容易混淆的概念 作为C 研发人员有必要了解其区别和实现 以下结合概念和源码加以说明 1 重载 重载指同一个类或者范围内 被声明的同名函数其参数数量或者类型不同 使用时根据函数参数列表确定调用哪个
  • Nginx的X-Accel-Redirect实现大文件下载

    一 文件下载的几种方式 1 直接给出下载地址 使用静态文件服务器nginx下载 任何人都可以下载 无法控制用户的权限 2 后端流式读取文件内容 设置header后疯狂输出 django文档中提到 可以向HttpResponse传递一个迭代器

随机推荐

  • TCP —— TCP连接的建立与释放

    一 TCP连接管理 在TCP连接建立的过程中 要解决以下三个问题 要使每一方都能够确知对方的存在 要允许双方协商一些参数 如最大窗口值 是否使用窗口扩大选项 时间戳选项及服务质量等 能够对运输实体资源 如缓存大小 连接表中的项目等 进行分配
  • echarts 暂无数据的完美解决办法

    前景 很简单的一个思想 我希望没有数据的时候 不显示图表 并且用empty来替换 但是直接使用v if 会出错 因为调用的时候 拿不到dom了 v if直接把dom干掉了 怎么办呢 直接上步骤 1 第一步 我们应该在每次点击按钮的时候 发送
  • EM算法及其推广---《统计学习方法》第9章

    EM算法是一种迭代算法 用于含有隐变量的概率模型参数的极大似然估计 或极大后验概率估计 EM算法的每次迭代由两步组成 E步求期望值 M步求最大值 EM算法是一种对模型参数的估计 该模型中含有隐变量 EM算法的引入 EM算法 概率模型有时既含
  • 即时通讯(IM)开源项目OpenIM每周迭代版本发布-音视频实时通话-v2.0.4

    介绍 OpenIM每周五发布新版 包括新特性发布 bug修复 同时合并PR 由于2 0版本重构完毕 架构更清晰 代码更规范 先邀请各位参与OpenIM社区建设 包括技术开发 技术分享等 特性开发 性能优化 bug修复等 有兴趣的同学可以加我
  • 使用burpsuite抓不到127.0.0.1本地包(针对Firefox浏览器)

    解决方法一 首先第一步点击浏览器右上角按钮 点击设置 点击常规 设置 按照如图设置 设置完毕后基本能解决问题 如果不行还有第二种解决方式 解决方法二 浏览器地址栏种输入 about config 搜索框输入如下 把值改为true即可 net
  • Spring Cloud微服务-网关(2)

    微服务网关Zuul 为什么需要微服务网关 不同的微服务一般有不同的网络地址 而外部的客户端可能需要调用多个服务的接口才 能完成一个业务需求 比如一个电影购票的收集APP 可能回调用电影分类微服务 用户 微服务 支付微服务等 如果客户端直接和
  • 二叉树的创建、遍历、深度、叶子节点数

    回忆一下 呵呵 include
  • Qt 打开本地文件夹,限定文件类型的两种方式

    需要打开本地文件夹的情况还挺多 比如File下面的open new save等功能 下面介绍两种打开本地文件夹的方式 第一种 QFileDialog getOpenFileName 函数 函数定义如下 QString QFileDialog
  • 树搜索:深度优先和广度优先

    在Android开发中 有时候会遇到多层级列表的显示 如下图 可用RecyclerView实现 其数据源的数据结构是一种树状结构 如下图 现在有两种方法来遍历这种数据结构 深度优先搜索 其过程简要来说是对每一个可能的分支路径深入到不能再深入
  • 基于springboot+vue民宿管理系统+数据库(附源码,说明文档)

    文章目录 开发环境 后端 前端 数据库 系统架构 管理员 用户用例 主要功能 用户功能模块 管理员功能模块 商家用户功能模块 前台首页功能模块 今天为大家带来的是 基于springboot vue民宿管理系统 开发环境 后端 开发语言 Ja
  • 理解线性回归(一)——回归的思想

    理解线性回归 一 回归的思想 1 经典的线性回归 之前介绍的LR回归和SVM算法本质上都和回归有写关联 尤其是LR回归算法 回归的目的是预测数值型的目标值 其核心部分和我们中小学时候学习到的线性拟合是一样的 就是说 假如我们能够建立了回归背
  • 刷脸支付三大优势让人回归万物本源

    3D人脸识别技术已实现检测人脸是否为活体 杜绝图片或视频破解 其高精度 高效率 高安全性催生刷脸支付 刷脸门禁 刷脸乘车 刷脸登机等应用落地 在5G AI引爆的万物互联未来 人回归智能万物的中心 脸成为无缝连接所有生活场景的重要途径 近期大
  • Python及pip安装与报错处理【pip永久换源】

    有帮助的话请点个赞吧 文章目录 安装新版本Python Linux系统 以Ubuntu16 04为例 Windows系统 Win10 pip换源 Linux系统 Windows系统 安装新版本Python Linux系统 以Ubuntu16
  • 微信小程序 引入字体图标 字体 使用base64解决字体请求问题

    在做公司的项目的时候 引入了奥森字体图标 控制台对这个url有报错提示 虽然字体显示正常 但还是想解决这个烦人的报错 试过加载目录中的fontawesome webfont ttf 静态资源但是加载不上 最后把ttf字体转换成base64格
  • 「司库立方」获数亿元C轮融资,持续聚焦司库赛道,引领行业变革

    今天 头部司库玩家 司库立方 宣布成功获得数亿元C轮融资 本轮融资由云晖资本领投 中信建投资本 贵阳创投 神骐资本 58产业基金 跟投 老股东信天创投持续追投 本轮融资资金主要用于迭代产品 加强市场推广 提升客户服务和体验 进一步扩大公司在
  • 史上最简单的SpringCloud教程

    在微服务架构中 根据业务来拆分成一个个的服务 服务与服务之间可以相互调用 RPC 在Spring Cloud可以用RestTemplate Ribbon和Feign来调用 为了保证其高可用 单个服务通常会集群部署 由于网络原因或者自身的原因
  • CAD平台开发和基于此平台的二次开发(数据库部分)

    CAD平台开发分为两大部分 一是底层开发 即CAD数据库的开发 底层类和结构 二是上层开发 界面和功能实现 本人目前在一个开发CAD平台的公司 工作 目前主要接触的是上层开发这一部分 没有底层开发的部分的代码 只有编号的底层数据库的DLL
  • MIPI DSI AP介绍(一)FPGA

    MIPI DSI AP介绍 一 FPGA MIPI DSI Mobile Industry Processor Interface Display Serial Interface 是一种用于移动设备显示的串行接口协议 它的主要特点是高带宽
  • 深入浅出PID控制算法(二)——PID算法离散化和增量式PID算法原理及Matlab仿真

    文章目录 1 PID算法离散化 1 1 位置式PID算法 1 2 增量式PID算法 2 PID编程实现及控制仿真 3 PID调参过程 3 1 确定比例系数Kp 3 2 确定积分时间常数Ti 3 3 确定微分时间常数Td 3 4 系统空载 带
  • C++ 修改/覆盖指定位置的文件内容或者从某个位置开始截断文件

    最新在进行文件方面的功能开发 遇到个这样的问题 1 文件读到中间 然后进行一些修改 2 然后将文件从修改后的地方截断 本以为这是个简单的操作 却花费了好大的功夫 网上并没有这样的例子 一通尝试 现在终于圆满解决了 特地记录一下 方便后来人