如何修改文件中间的几个字节

工作中碰到一个问题,如何只修改文件中间的几个字节,而其他的内容不变。这个问题看似简单,但是很多人估计都不知道怎么做。我开始seek到文件的特定的位置,然后写文件,但是使用的文件打开模式不对,文件不是被清空,就是被截断,达不到效果。

fopen的打开模式

在C语言中文件打开方式有这么几种:

  • r   以只读方式打开文件,只能读不能写,往文件中写是没有任何效果的
  • r+  可以读,也可以写,文件打开的时候,指向文件开头,可以通过seek改变读写位置
  • w  这种方式打开的文件句柄,只能写,如果文件存在则将长度清零,否则新建文件,这种句柄通过seek之后,seek位置之前的文件数据全部变成0x00
  • w+ 同w选项,只不过多了一个可读功能
  • a  这种方式打开的文件,可以写,但是位置在文件末尾,即使往回seek也没有用,数据还是从文件末尾开始附加
  • a+ 同a选项,多了可读的功能

另外还有2个选项,可以与上面的6个选项复合使用,一个是t表示以文本的方式打开文件(默认是t),一个是b表示以二进制的方式打开文件,t和b是互斥的不能同时使用。当与b组合时,有这么几种方式:wb、ab、rb、wb+、ab+、rb+,而a,w,r这几个选项是不能组合使用的,其中a,w都表示写文件,只不过一个在文件尾,一个在文件开始处,r表示读文件。我试过将a,w,r几个两两组合使用,发现下面的现象:

  • wr 与w效果一样
  • rw与r效果一样
  • aw与a效果一样
  • wa 与w效果一样
  • ar与a效果一样
  • ra与r效果一样

可以看出来当a,w,r在一起组合使用的时候,其后面的选项实际上好像是被忽略了

问题的解决方法:rb+打开文件

所以解决文章开头提出来的问题,应该使用  rb+ 的方式打开文件,这种方式打开的文件,可读,可写,打开之后写指针在文件开始处,可以任意seek,而seek之后写的内容会覆盖被写的内容,其他没有写到的内容不会有改变。

测试程序

//程序测试结果在ubuntu linux下运行获得
#include <stdio.h>
#include <string.h>
int main()
{
   //文件原始数据
   //00 01 02 03 04 05 06 07 08 09

   //下面每一个fopen前面注释中的数据是以该方式打开文件,写文件之后文件的内容

   //00 00 00 00 CC DD
   //FILE * file = fopen("./test.data","wb+");

   //00 00 00 00 CC DD
   //FILE * file = fopen("./test.data","wb");

   //00 01 02 03 CC DD 06 07 08 09
   FILE * file = fopen("./test.data","rb+"); //这种是正确的做法

   //00 01 02 03 04 05 06 07 08 09
   //FILE * file = fopen("./test.data","rb");

   //00 01 02 03 04 05 06 07 08 09 CC DD
   //FILE * file = fopen("./test.data","ab");

   //00 01 02 03 04 05 06 07 08 09 CC DD
   //FILE * file = fopen("./test.data","ab+");

   //00 00 00 00 CC DD
   //FILE * file = fopen("./test.data","wr");

   //00 01 02 03 04 05 06 07 08 09
   //FILE * file = fopen("./test.data","rw");

   //00 01 02 03 04 05 06 07 08 09 CC DD
   //FILE * file = fopen("./test.data","aw");

   //00 00 00 00 CC DD
   //FILE * file = fopen("./test.data","wa");

   //00 01 02 03 04 05 06 07 08 09 CC DD
   //FILE * file = fopen("./test.data","ar");

   //00 01 02 03 04 05 06 07 08 09
   //FILE * file = fopen("./test.data","ra");
   if(file!=NULL)
   {
      char buffer[]={0xCC,0xDD};
      fseek(file,4,SEEK_SET);
      fwrite(buffer,1,sizeof(buffer),file);
      fclose(file);
   }
   return 0;
}
时间: 2024-08-29 18:28:12

如何修改文件中间的几个字节的相关文章

一个修改文件中指定内容的程序

下面是一个修改文件中指定内容的程序,这里面主要用到了以下几个函数: FILE * fopen(const char * path,const char * mode); size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ; buffer:用于接收数据的内存地址: size:要读的每个数据项的大小,单位为字节: count:要读的数据项的个数: stream:输入流. size_t fwrite(const

linux下C++修改文件内容

C fwrite在任意位置写入文件,并可修改文件内容 想实现类似迅雷那样下载时可以从文件半中间写入的功能 1 #include<stdio.h> 2 int main() 3 { 4 FILE *fp; 5 fp=fopen("overwrite.bin","rb+"); //使用rb+模式,可以往半中间插入数据,而且是覆盖插入,若使用"ab+"每次都插入到最后面,调用fseek也没用 6 if(NULL != fp) 7 { 8 i

springMVC下载文件前修改文件名字

很多时候,为了方便,下载文件其实就直接写了一个文件在服务器上面的路径,然后直接点击一个这个地址,浏览器就自然而然的开始下载了. 但是这次项目需要在文件下载之前修改文件的名字,也就是说,服务器上文件的名字和下载到本地文件的名字是不一样的. 而在springMVC中怎么实现呢? 下面就是代码部分 /** * 下载文件 * @author xx * */ @Controller @RequestMapping("downloadFile") @Scope(value="protot

windows下修改文件时的换行符引起在linux运行不正常的解决

env: /etc/init.d/nginx: No such file or directory 原因:在windows下修改文件的时候换行符出的问题. windows和linux下的换行符是不同的.一般操作系统上的运行库会自动决定文本文件的换行格式. 如一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在linux上运行就生成LF格式换行的文本文件. 在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题, 特别是在编辑程序代码时. 有时候代码在编辑器中显示正常,

linux+nginx+mysql+php系统修改文件上传大小限制

linux+nginx+mysql+php系统修改文件上传大小限制 对于LNMP框架的一些网站,上传文件大小会受到多个方面的限制,一个是nginx本身的限制,限制了客户端上传文件的大小,会报错"413 Request Entity Too Large":一个是php.ini文件中默认了多个地方的设置. 1.  在php.ini中,做如下修改:① file_uploads = On默认允许HTTP文件上传,此选项必须设置为On.② upload_tmp_dir =默认为空③ upload

Spring Boot在开发时实现热部署(开发时修改文件保存后自动重启应用)

热部署是什么 大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的Class文件,这个文件里记录着和代码等对应的各种信息,然后Class文件将被虚拟机的ClassLoader加载. 而热部署正是利用了这个特点,它监听到如果有Class文件改动了,就会创建一个新的ClaassLoader进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前. 类加载机制 Java中的类经过编译器可以把代码编译为存储字节码的C

IIS修改文件上传大小限制

修改文件上传大小限制 --IIS小知识 Web项目部署到IIS服务器上后,有时 在页面上传文件时,莫名失败 上传不上去,这是因为 IIS服务器有限制 一般不建议web端做大文件上传处理,受很多因素影响,可能文件会有损坏,如果实在需要做大文件上传,建议使用客户端 利用断点续传,保证文件的完整性. 下面教大家修改IIS服务器的文件上传大小限制: 如图:打开 '请求筛选'功能 点击'编辑功能设置-' 会弹出 编辑请求筛选框,可以看到请求限制区有个'允许的最大内容长度(字节)(C)' 这里就是限制文件的

背水一战 Windows 10 (87) - 文件系统: 获取文件的属性, 修改文件的属性, 获取文件的缩略图

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 获取文件的属性 修改文件的属性 获取文件的缩略图 示例1.演示如何获取文件的属性,修改文件的属性FileSystem/FileProperties.xaml <Page x:Class="Windows10.FileSystem.FileProperties" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentatio

第八天 文件的读,写,追加,读写,写读,seek()光标的移动,修改文件以及另一种打开文件的方式

主要内容:    1.初始文件操作 2.只读( r,rb ) 3.只写( w,wb ) 4.追加( a ,ab) 5.读写( r+ ) 6.写读( w+ ) 7.追加写读 ( a+ ) 8.其他操作方法 9.文件的修改以及另一种打开文件句柄的方式 一.初始文件的操作    使用python来读写文件是非常简单的操作. 我们使用open()函数来打开?个文件, 获取到文件句柄. 然后通过文件句柄就可以进行各种各样的操作了. 根据打开方式的不同能够执行的操作也会有相应的差异. 打开文件的方式: r,